gpt4 book ai didi

java - JToolbar 中的 JTextField - 无法在 Linux 和 Windows 中正确显示

转载 作者:太空狗 更新时间:2023-10-29 11:38:32 28 4
gpt4 key购买 nike

请参阅下面的 SSCCE:

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 操作系统,但我很好奇结果如何。

最佳答案

作为替代方案,考虑将 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();
}
});
}
}

关于java - JToolbar 中的 JTextField - 无法在 Linux 和 Windows 中正确显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15472260/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com