2013-03-18 16 views
2

正常显示,请参见下面的SSCCE:我使用“系统”外观和感觉的JTextField在JToolBar中 - 不能在Linux和Windows

import java.awt.BorderLayout; 
import java.awt.Component; 
import java.awt.Dimension; 
import java.awt.EventQueue; 

import javax.swing.Box; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JTextField; 
import javax.swing.JToolBar; 
import javax.swing.UIManager; 
import javax.swing.border.EtchedBorder; 


@SuppressWarnings("serial") 
public class GlueTest extends JComponent { 

    private JFrame frame; 
    private JToolBar toolbar; 
    private JLabel label_1; 
    private JTextField textField_1; 
    private JLabel label_2; 
    private JTextField textField_2; 

    public static void main(String[] args) { 
     try { 
      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
     } catch (Throwable e) { 
      e.printStackTrace(); 
     } 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        GlueTest window = new GlueTest(); 
        window.frame.setVisible(true); 
        window.frame.requestFocusInWindow(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    public GlueTest() { 
     initialize(); 
    } 

    private void initialize() { 
     frame = new JFrame("Test"); 
     frame.setBounds(0,0,800,600); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     toolbar = new JToolBar(); 
     toolbar.setFloatable(false); 
     toolbar.setBorder(new EtchedBorder(EtchedBorder.LOWERED, null, null)); 
     toolbar.setMaximumSize(new Dimension(frame.getWidth(), frame.getHeight())); 
     frame.getContentPane().add(toolbar, BorderLayout.NORTH); 

     Component horizontalGlue = Box.createHorizontalGlue(); 
     toolbar.add(horizontalGlue); 

     label_1 = new JLabel(" 1 "); 
     toolbar.add(label_1); 

     textField_1 = new JTextField(); 
     textField_1.setColumns(9); 
     textField_1.setMaximumSize(textField_1.getPreferredSize()); 
     toolbar.add(textField_1); 

     label_2 = new JLabel(" 2 "); 
     toolbar.add(label_2); 

     textField_2 = new JTextField(); 
     textField_2.setColumns(9); 
     textField_2.setMaximumSize(textField_2.getPreferredSize()); 
     toolbar.add(textField_2); 
    } 
} 

通知。在Windows 7中,它完美显示。文本字段会自动调整到最大尺寸,并且左侧的水平胶会尽可能增大,从而强制它们对齐。

enter image description here

然而,在Linux操作系统(Ubuntu的12.04,如果它事项),它结束了方式不同。文本字段从框架滚动!水平胶水本身太大。

enter image description here

我已经尝试过其他几种不同的方式来得到它在两个正常显示,没有运气。实际上,在Linux下正确显示它的唯一方法是删除文本字段的所有样式(最大宽度,列等),然后成功不滚动框架,但它没用,因为它只有几个像素的宽度。

作为一个旁注,我甚至没有机会尝试在Mac OS上,但我很好奇结果如何

+0

,如果你不使用'system'的外观和感觉,会发生什么? – 2013-03-18 08:18:13

+0

@JeanHominal好问题。只是用'Metal'的外观和感觉来试用它,它在Linux上运行良好。 – The111 2013-03-18 08:21:20

+0

在添加组件结束时,不要调用'frame.setBounds(0,0,800,600);'调用'frame.pack()'。另外删除'toolbar.setMaximumSize(new Dimension(frame.getWidth(),frame.getHeight()));'。 GUI是否像你期望的那样出现在* nix上? – 2013-03-18 08:38:00

回答

2

问题(不是*** nix的用户),你有这个代码

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.EventQueue; 
import javax.swing.Box; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JTextArea; 
import javax.swing.JTextField; 
import javax.swing.JToolBar; 
import javax.swing.border.EtchedBorder; 

@SuppressWarnings("serial") 
public class GlueTest extends JComponent { 

    private JFrame frame; 
    private JToolBar toolbar; 
    private JLabel label_1; 
    private JTextField textField_1; 
    private JLabel label_2; 
    private JTextField textField_2; 

    public GlueTest() { 
     toolbar = new JToolBar(); 
     toolbar.setFloatable(false); 
     toolbar.setBorder(new EtchedBorder(EtchedBorder.LOWERED, null, null)); 
     toolbar.setAlignmentY(TOP_ALIGNMENT); 
     toolbar.add(Box.createHorizontalGlue()); 

     label_1 = new JLabel(" 1 ");   
     toolbar.add(label_1); 
     toolbar.add(Box.createRigidArea(new Dimension(10,1))); 

     textField_1 = new JTextField(); 
     textField_1.setColumns(9); 
     textField_1.setMaximumSize(textField_1.getPreferredSize()); 
     toolbar.add(textField_1); 
     toolbar.add(Box.createHorizontalStrut(10)); 

     label_2 = new JLabel(" 2 "); 
     toolbar.add(label_2); 
     toolbar.add(Box.createRigidArea(new Dimension(10,1))); 

     textField_2 = new JTextField(); 
     textField_2.setColumns(9); 
     textField_2.setMaximumSize(textField_2.getPreferredSize()); 
     toolbar.add(textField_2); 
     toolbar.add(Box.createHorizontalStrut(10)); 

     frame = new JFrame("Test"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(toolbar, BorderLayout.NORTH); 
     frame.add(new JTextArea(10, 40)); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       GlueTest window = new GlueTest(); 
      } 
     }); 
    } 
} 

开关相同的问题BUILT_IN的BoxLayout到的borderlayout

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextArea; 
import javax.swing.JTextField; 
import javax.swing.JToolBar; 
import javax.swing.border.EtchedBorder; 

@SuppressWarnings("serial") 
public class GlueTest extends JComponent { 

    private JFrame frame; 
    private JToolBar toolbar; 
    private JLabel label_1; 
    private JTextField textField_1; 
    private JLabel label_2; 
    private JTextField textField_2; 

    public GlueTest() { 
     toolbar = new JToolBar(); 
     toolbar.setFloatable(false); 
     toolbar.setBorder(new EtchedBorder(EtchedBorder.LOWERED, null, null)); 
     toolbar.setLayout(new BorderLayout(10, 10)); 
     JPanel panel = new JPanel(); 
     panel.setOpaque(false); 
     label_1 = new JLabel("1");   
     panel.add(label_1); 
     textField_1 = new JTextField(); 
     textField_1.setColumns(9); 
     panel.add(textField_1); 
     label_2 = new JLabel("2"); 
     panel.add(label_2); 
     textField_2 = new JTextField(); 
     textField_2.setColumns(9); 
     panel.add(textField_2); 
     toolbar.add(panel, BorderLayout.EAST); 
     frame = new JFrame("Test"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(toolbar, BorderLayout.NORTH); 
     frame.add(new JTextArea(10, 40)); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       GlueTest window = new GlueTest(); 
      } 
     }); 
    } 
} 
+0

是的,同样的问题。和我的版本一样,只有在使用'系统'外观时才存在。 – The111 2013-03-18 09:31:11

+0

然后必须有一些问题与built_in BoxLayout,将此布局更改为BorderLayout,将编辑此帖子 – mKorbel 2013-03-18 09:35:21

+0

谢谢。我正在上床睡觉,但是你的代码的一个快速测试运行似乎是它的伎俩。Upvote现在,将明天更广泛地玩耍,并接受答案,如果我找不到更多的问题。 :-)奇怪的是在Java盒子布局中找到这样一个糟糕的错误。 – The111 2013-03-18 09:47:50

3

作为替代方案,可以考虑改变JToolBar布局到FlowLayout.RIGHT

Ubuntu screenshot

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.FlowLayout; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JTextArea; 
import javax.swing.JTextField; 
import javax.swing.JToolBar; 
import javax.swing.border.EtchedBorder; 

public class Test extends JComponent { 

    public Test() { 
     JToolBar toolbar = new JToolBar(); 
     toolbar.setBorder(new EtchedBorder(EtchedBorder.LOWERED, null, null)); 
     toolbar.setLayout(new FlowLayout(FlowLayout.RIGHT)); 
     toolbar.add(new JLabel("1")); 
     toolbar.add(new JTextField(9)); 
     toolbar.add(new JLabel("2")); 
     toolbar.add(new JTextField(9)); 

     JFrame frame = new JFrame("Test"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(toolbar, BorderLayout.NORTH); 
     frame.add(new JTextArea(10, 40)); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       Test window = new Test(); 
      } 
     }); 
    } 
} 
+0

尽可能最简单,请做OPs代码在你的环境也造成同样的问题 – mKorbel 2013-03-18 17:21:38

+0

感谢垃圾箱,这是一个不错的想法,不幸的是我的SSCCE有点简单,因为它掩盖了事实,我的真实应用程序也有左对齐的按钮,因此水平胶水。 @camickr在上面OP的评论中发现了我认为的真正问题。 – The111 2013-03-18 17:30:44

+0

是的,但我(不小心)假设了一个默认的“BoxLayout”。 – trashgod 2013-03-18 17:31:25