繁体   English   中英

Java在JButton的中间添加一个JLabel

[英]Java add a JLabel in the middle of a JButton

我想简单地将JLabel添加到JButton中并将其水平居中。 我已经尝试了很多事情,但文字停留在左侧...这是我的代码:

    JLabel labeltest = new JLabel("Simple test");
    JButton myButton = new JButton();
    myButton.setHorizontalTextPosition(SwingConstants.CENTER);
    myButton.add(labeltest);

输出图片

创建文本的图标,然后为图标提供所需的前景色/背景色。

我试过了,但是问题出在我必须做button.setenabled(false);时。 在此之后,文本几乎变得不可见

您可以将禁用的图标设置为与图标相同,并且不会在禁用状态下绘制它:

JButton button = new JButton( new ImageIcon(...) );
button.setDisabledIcon( button.getIcon() );
button.setEnabled(false);

当然,这种方法的问题在于用户不知道该按钮已被禁用。 因此,实际上您需要2个图标:

  1. 一种为正常状态
  2. 一种用于残疾人状态

JButton也是java.awt.Container 这样就可以设置一个布局管理器。 例如,您可以使用GridBagLayout。

public class Main {

  public static void main(String[] args) {
    JFrame frame = new JFrame();

    JToggleButton toggleButton = new JToggleButton();
    JLabel jLabel = new JLabel("3");

    JToggleButton.ToggleButtonModel toggleButtonModel = (JToggleButton.ToggleButtonModel) toggleButton.getModel()
    ToggleForegroundAction toggleForegroundAction = 
            new ToggleForegroundAction(toggleButtonModel, Color.WHITE, Color.RED);
    toggleForegroundAction.setComponent(jLabel);
    toggleButton.setAction(toggleForegroundAction);

    toggleButton.setLayout(new GridBagLayout());
    toggleButton.add(jLabel, new GridBagConstraints());

    JPanel panel = new JPanel();
    panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
    panel.setLayout(new BorderLayout());
    panel.add(toggleButton, BorderLayout.CENTER);

    Container contentPane = frame.getContentPane();
    contentPane.add(panel);

    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    frame.setLocationRelativeTo(null);
    frame.pack();
    frame.setVisible(true);
  }
}

切换标签前景色的操作可能如下所示

  public class ToggleForegroundAction extends AbstractAction {

    private JComponent component;
    private JToggleButton.ToggleButtonModel toggleButtonModel;
    private final Color selectedColor;
    private final Color unselectedColor;

    public ToggleForegroundAction(JToggleButton.ToggleButtonModel toggleButtonModel, Color selectedColor, Color unselectedColor) {
      this.toggleButtonModel = toggleButtonModel;
      this.selectedColor = selectedColor;
      this.unselectedColor = unselectedColor;
    }

    public void setComponent(JComponent component) {
      this.component = component;
      setForeground(component, toggleButtonModel.isSelected());
    }

    @Override
    public void actionPerformed(ActionEvent e) {
      JComponent targetComponent = this.component;
      if (targetComponent == null) {
        targetComponent = (JComponent) e.getSource();
      }
      setForeground(targetComponent, toggleButtonModel.isSelected());
    }

    private void setForeground(JComponent targetComponent, boolean isSelected) {
      Color foreground;
      if (isSelected) {
        foreground = selectedColor;
      } else {
        foreground = unselectedColor;
      }
      targetComponent.setForeground(foreground);
    }
  }

未选择 => 已选

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM