【问题标题】:JButton disappears when resize调整大小时JButton消失
【发布时间】:2012-09-01 23:29:05
【问题描述】:

任何人都知道或知道为什么在我调整小程序大小后我的按钮消失了?

这是我的代码:

import java.awt.event.*; import javax.swing.*; import acm.program.*; public class button extends ConsoleProgram { public void init(){ hiButton = new JButton("hi"); add(hiButton, SOUTH); addActionListeners(); } public void actionPerformed(ActionEvent e){ if(hiButton == e.getSource()){ println("hello") ; } } private JButton hiButton; }

【问题讨论】:

  • 你确定这是一个小程序吗?是JApplet吗?
  • 是的,说它是顶部的小程序。但是,是的,它是一个 acm 程序。
  • 闪烁或完全消失?
  • 这不是家庭作业。只需通过斯坦福大学 youtube 频道学习 java。无论如何,似乎答案是不使用 ACM 哈哈 ..
  • 您可以尝试在 Java 1.5 下运行它,就像他们在 here 所做的那样。

标签: java swing jbutton


【解决方案1】:

我不确定重新定义 init 方法是否是个好主意。当我查看http://jtf.acm.org/javadoc/student/acm/program/ConsoleProgram.html 时,我希望您只实现了运行方法。在不调用 super.init() 的情况下覆盖 init 对我来说看起来很奇怪。

也许我会更好地直接从 JApplet 派生您在 Applet 编程的第一步。

【讨论】:

    【解决方案2】:

    假设

    • 您的 ConsoleProgram 扩展(直接或间接)JApplet
    • 您将 SOUTH 声明为具有值 BorderLayout.SOUTH 的静态最终变量(否则您的代码无法编译)

    代码应该可以工作,无需重新绘制(除非您想做一些特定于应用程序的优化)。我刚刚复制并粘贴了您的代码(通过明确上面的两个假设),我看到了小程序并且按钮在调整大小时没有消失。

    反正代码里有几个“不好”的东西:

    1. 首先,命名约定问题:类名应为“Button”,首字母大写(除此之外,这对于 Applet 来说是个糟糕的名称)
    2. 二、添加组件前要附加动作监听器;
    3. 第三,正如 Oracle 文档所建议的 here,构建 GUI 的代码应该是在事件调度程序线程上运行的作业。您可以通过使用 SwingUtilities.invokeAndWait(Runnable()
    4. 将构建 gui 代码包装在 Runnable 中来做到这一点

    【讨论】:

      【解决方案3】:

      您是否尝试过在您的 init() 方法开始时调用 super.init()?

      【讨论】:

        【解决方案4】:

        尝试为您的控制台明确使用布局,然后使用相对定位。

        【讨论】:

          【解决方案5】:

          在 Applet 中调整按钮的大小:

          public class Button extends JApplet implements ActionListener {
          
             private JButton button;
          
             public void init() {
                Container container = getContentPane();
                container.setLayout(null);
                container.setBackground(Color.white);
                button = new JButton("Press Me");
                button.setSize(getWidth()/2,20);
                button.setLocation(getWidth()/2-button.getSize().width/2, getHeight()/2-button.getSize().height/2);
                container.add(button);
                button.addActionListener(this);
             }
          
             public void actionPerformed(ActionEvent e) {
                int width = (button.getSize().width == getWidth()/2) ? getWidth()/4 : getWidth()/2;
                int height = button.getSize().height;
                button.setSize(width,height);
                button.setLocation(getWidth()/2-width/2, getHeight()/2-height/2);
             }
          }
          

          在 JFrame 中调整按钮的大小:

          public class Button extends JFrame implements ActionListener {
             private JButton button;
          
             public Button(String title) {
                Container container = getContentPane();
                container.setLayout(null);
                container.setBackground(Color.white);
                setTitle(title);
                setSize(400,400);
                button = new JButton("Press Me");
                button.setSize(getWidth()/2,20);
                button.setLocation(getWidth()/2-button.getSize().width/2,
                               getHeight()/2-button.getSize().height/2);
                container.add(button);
                button.addActionListener(this);
              }
          
             public void actionPerformed(ActionEvent e) {
                int width = (button.getSize().width == getWidth()/2) ? getWidth()/4 : getWidth()/2;
                int height = button.getSize().height;
                button.setSize(width,height);
                button.setLocation(getWidth()/2-width/2, getHeight()/2-height/2);
             }
          
             public static void main(String[] args) {
                Button button = new Button("Test");
                button.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                button.setVisible(true);
             }
          }
          

          【讨论】:

          • -1 用于推荐空布局(又名:手动调整大小/定位组件):无论出现什么问题,这不是解决方案的 Swing'ish 方式。跨度>
          • @kleopatra 为“绝对定位”使用空布局有什么问题。它在文档 (docs.oracle.com/javase/tutorial/uiswing/layout/none.html) 中,我的代码就是一个示例。
          • 主要问题是,当影响布局的任何子节点上的任何属性发生变化时,您必须重新进行所有计算——这正是经理所做的。手动这样做不仅浪费时间(您必须重新编码大量代码),而且很难做到正确:您需要听取所有这些更改,但仍然可能无法收到所有通知(缺少手动重新/验证, f.i.)
          【解决方案6】:

          你声明重绘方法了吗……???

          您正在使用摇摆。它需要声明重绘。

          请定义一个自定义重绘 mwthod

          【讨论】: