【问题标题】:JButton ignore indicated sizeJButton 忽略指示的大小
【发布时间】:2014-03-09 14:59:06
【问题描述】:

我是 Swing 的新手。我正在尝试创建一个 800x600 的窗口,它将被分成两个相等的部分 (800x300):第一个是不可变的文本区域,第二个是 - 按钮。

问题: 按钮应该占据窗口的下半部分。但似乎按钮大小不正确。

代码:

import javax.swing.*;
import javax.xml.parsers.ParserConfigurationException;
import java.awt.*;
import java.io.IOException;
import java.util.Collections;
import java.util.List;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Main {

    public static void main(String[] args) throws ParserConfigurationException, IOException, SAXException {
        JFrame.setDefaultLookAndFeelDecorated(true);
        final JFrame frame = new JFrame("Lingvo frame");
        frame.setPreferredSize(new Dimension(800, 600));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel panel = new JPanel(new GridLayout(4,4,4,4));
        final JButton showResultButton = new JButton();
        showResultButton.setPreferredSize(new Dimension(800, 300));
        showResultButton.setHorizontalAlignment(SwingConstants.CENTER);
        showResultButton.setVerticalAlignment(SwingConstants.BOTTOM);

        frame.add(panel);
        panel.add(showResultButton);

        frame.pack();
        frame.setVisible(true);

        showResultButton.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent arg0) {
                showResultButton.setText("translation");
            }
        });
    }
} 

【问题讨论】:

    标签: java swing awt


    【解决方案1】:

    只需将您的框架设置为GridLayout。另请注意,只需使用此构造函数 JtextArea(rows, columns) 设置 JTextArea 的大小,只需 pack() 您的框架即可。无需将大小设置为任何内容。 GridLayout 将根据JTextArea 的大小为您处理JButton 的大小

    还应从事件调度线程运行 Swing 应用程序。见Initial Threads

    另请参阅Laying out Components within a Container,了解有关布局管理器的更多信息。

    这是一个运行示例

    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    public class Main {
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    JFrame.setDefaultLookAndFeelDecorated(true);
                    final JFrame frame = new JFrame("Lingvo frame");
    
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
                    final JButton showResultButton = new JButton();
                    final JTextArea textArea = new JTextArea(20, 60);
    
                    frame.setLayout(new GridLayout(2, 1));
                    frame.add(textArea);
                    frame.add(showResultButton);
    
                    frame.pack();
                    frame.setVisible(true);
    
                    showResultButton.addActionListener(new ActionListener() {
    
                        public void actionPerformed(ActionEvent arg0) {
                            showResultButton.setText("translation");
                        }
                    });
                }
            });
        }
    }
    

    【讨论】:

    • 您能否将对齐的 JTextArea 文本对齐到中心?并为其设置一些漂亮的字体?
    • 居中对齐是什么意思?另见How to Use Fonts。一旦你知道了,只需使用textArea.setFont(font)
    • 我的意思是如果我将文本设置为 JTextArea 它将显示在文本区域的左上角
    • 所以您希望它在左上角对齐?
    • 我希望它在中心对齐(水平和垂直)
    【解决方案2】:

    插入按钮的面板有一个GridLayout(4,4,4,4)。这意味着面板将包含 4*4 组件,并且所有组件都将具有相同的大小 (!)。

    您的代码目前不包含文本区域。但是根据描述,您的布局可能可以通过

    panel.setLayout(new GridLayout(2,1));
    panel.add(theTextArea); // The top half
    panel.add(button); // The bottom half
    

    您必须阅读一些有关布局管理器的内容 (http://docs.oracle.com/javase/tutorial/uiswing/layout/using.html) 才能熟悉它们。特别是关于他们如何考虑“首选尺寸”的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-08
      • 2021-05-18
      相关资源
      最近更新 更多