【问题标题】:First button appears on the frame but second button does not in java第一个按钮出现在框架上,但第二个按钮不在java中
【发布时间】:2017-02-20 11:59:54
【问题描述】:

我对 Java 很陌生。我应该有一个有两个按钮的框架。第一个按钮使用户浏览图像并且它起作用。第二个按钮应该通过对话框询问参数,但它甚至没有出现在框架上。

编辑:我以一种愚蠢的方式解决了这个问题,但无论如何感谢。我为 button2 添加了 setVisible(true) 并且它以某种方式起作用。奇怪的是我没有为按钮做同样的事情,但它仍然有效。我没有得到它,但如果它有效,它就有效。再次感谢,希望其他人可以从你的答案中得到解决方案。

public class ImageBrowser extends JFrame {

private static final long serialVersionUID = 1L;
JButton button, button2;
JLabel label;

private int K;
private int IFP;



public ImageBrowser() {
    super("Image Browser");

    button = new JButton("Browse");
    button.setBounds(200, 300, 90, 40);
    label = new JLabel();
    label.setBounds(10, 10, 256, 256);
    button2 = new JButton("Parameters");
    button2.setBounds(500, 300, 150, 40);

    add(button);
    add(label);
    add(button2);

    button.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            // textArea.setText("");
            JFileChooser file = new JFileChooser();
            file.setCurrentDirectory(new File(System
                    .getProperty("user.home")));
            // filter the files
            FileNameExtensionFilter filter = new FileNameExtensionFilter(
                    "*.Images", "jpg", "gif", "png", "tif");
            file.addChoosableFileFilter(filter);
            int result = file.showOpenDialog(null);

            if (result == JFileChooser.APPROVE_OPTION) {

                File selectedFile = file.getSelectedFile();

                String path = selectedFile.getAbsolutePath();
                label.setIcon(ResizeImage(path));
                getPixels(selectedFile);
            }

            else if (result == JFileChooser.CANCEL_OPTION) {
                System.out.println("No File Select");
            }

        }
    });

    button2.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            String input = JOptionPane
                    .showInputDialog("Please input Parameter k");
            if (input == null)
                return;
            int K = Integer.parseInt(input.trim());

            input = JOptionPane
                    .showInputDialog("Please input  Parameter ifp");
            if (input == null)
                return;
            int IFK = Integer.parseInt(input.trim());

        }
    });
    setLayout(null);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLocation(100, 100);
    setSize(700, 400);
    setVisible(true);
}


public static void main(String[] args) throws IOException {
    new ImageBrowser();

}

}

【问题讨论】:

  • 这段代码对我有用。
  • Java GUI 必须在不同的操作系统、屏幕尺寸、屏幕分辨率等上使用不同的语言环境中的不同 PLAF。因此,它们不利于像素完美布局。而是使用布局管理器,或 combinations of them 以及 white space 的布局填充和边框。
  • 1) 以最小尺寸提供 ASCII 艺术或 GUI 的 预期 布局的简单绘图,如果可调整大小,则具有更大的宽度和高度。 2) 为了尽快获得更好的帮助,请发布minimal reproducible exampleShort, Self Contained, Correct Example。 (似乎动作侦听器以及getPixels(..)ResizeImage(..) 方法与布局问题无关。3)请学习常见的Java 命名法(命名约定-例如EachWordUpperCaseClassfirstWordLowerCaseMethod()firstWordLowerCaseAttribute除非它是 UPPER_CASE_CONSTANT) 并始终使用它...
  • .. 4) 源代码中的一个空白行是永远需要的。 { 之后或} 之前的空行通常也是多余的。
  • “我没明白,但如果它有效,它就有效。”(悲伤地摇头)这不是一个解决方案。这是一个可能会随机工作的黑客(并且通过扩展,随机失败)。使固定。这。布局。

标签: java swing layout-manager null-layout-manager


【解决方案1】:

您将布局设置为 null,因此您具有绝对定位并且您的组件相互重叠

  setLayout(null); 

您可以尝试其他布局管理器,例如 FlowLayout:

  setLayout(new FlowLayout()); 

Here你有布局管理器的描述

【讨论】:

  • 看坐标,我看不出它们是如何重叠的?
  • @SteveSmith 有很多原因不使用null布局。
  • @SteveSmith “组件不重叠 AFAIKS。” 那么?当我运行代码并向标签添加线条边框时,我看到了两个按钮和一个标签(或者至少是标签的轮廓)。尽管如此,OP 声称他们没有看到第二个按钮,这可能是由于我们不应该使用幻数定位组件的许多其他原因。他们应该修复的第一件事是不使用布局的代码部分,然后我希望他们报告的当前问题将得到修复。这个答案建议了解决方案的正确方法。
  • @SteveSmith “这是一个意见问题” 每个人都有权发表意见,OTOH 来自Is “Don't do it” a valid answer? 的共识是“哎呀——如果你有更好的方法” .我的观点是,如果有人发布一个应用创可贴来修复null 布局的答案,那么它应该被否决,因为它不能解决根本问题,并且会导致 OP当 GUI 以其他方式崩溃时,再问(至少)两个问题。
  • @SelimŞahin 如果您使用正确的layout manager,则不需要。请参阅Null layout is evilthis question 中的答案,了解为什么应该避免使用null layout 和绝对定位(即setBounds(...)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-04
  • 1970-01-01
  • 2017-08-06
  • 1970-01-01
  • 2023-03-31
  • 2015-09-30
  • 2023-03-22
相关资源
最近更新 更多