2

我已经搜索了这个问题,但没有找到任何接近的东西。我将尝试具体并发布代码,但是这是一个大型程序,因此我无法发布所有代码。一般的问题是这样的:一个面板上的 JButton 会导致另一个面板上的组件在第一次单击时移动。仅当按钮添加了动作侦听器时才会发生这种情况。(在没有动作监听器的情况下单击按钮(显然))。问题是我添加的动作监听器仅更改按钮背景、文本和大小(以适应新文本)。

这是目前的动作监听器。登录是 JButton:

private class LoginListener implements ActionListener{

  public void actionPerformed(ActionEvent e){

    loggedIn = !loggedIn;

    if(loggedIn){
      login.setText("Logout");
      login.setBackground(Constants.RED);
    }
    else{
      login.setText("Login");
      login.setBackground(Constants.UPPER_BOUNDARY);
    }

    login.setSize(login.getPreferredSize());
  }
}

设置是这样的。动作监听器是登录按钮所在的 loginPanel 的子类。该 loginPanel 被添加到主 JFrame 框架的上 1/4 处。主 JFrame 的下 3/4 是 mainPanel,其中包含其他摆动组件。loginPanel 和 mainPanel 不共享组件或变量,也不真正知道彼此的存在(据我编码)。然而,当上面的这个动作监听器被添加到主面板中的登录按钮组件时,它们会从它们的位置转移到其他位置。唯一发生在第一次单击时,然后它们停留在它们所在的位置(而不是我想要它们的位置)。

其他因素: - 我使用绝对定位(对不起,如果你不喜欢它,但我更喜欢它) - 我使用的是 SynthLookAndFeel,但以前从未遇到过这种外观和感觉的问题。

谢谢

4

1 回答 1

4

其他因素: - 我使用绝对定位(对不起,如果你不喜欢它,但我更喜欢它)

没有什么可遗憾的,解决方案很简单:不要使用绝对定位,而是学习并使用布局管理器来充分发挥其能力。使用它们的原因之一是避免像这样的有害错误。很有可能您的代码实际上正在使用组件的默认布局管理器,即使在您不知道的情况下也是如此。你可以在这里找到更多关于它们的信息。使用它们的关键之一是使用嵌套的 JPanel 来嵌套它们,每个 JPanel 都使用自己的布局管理器。然后他们可以自动为您完成繁重的布局提升。

于 2012-05-29T01:24:41.687 回答