【问题标题】:Swing: grayable multi-line JCheckBox?Swing:可灰化的多行 JCheckBox?
【发布时间】:2015-04-02 22:05:19
【问题描述】:

我想要一个带有多行文本的复选框,有时我想禁用它。

  • 简单的 JCheckBox 可以正常工作并被禁用,但它不是多行的。
  • 放置 line1
    line2 提供了正确的大小和布局,但是当我禁用控件时,只有复选框本身变灰,文本保持黑色。
  • 我知道我可以将 HTML 文本颜色更改为灰色,但这不适用于“经典 Windows”外观,其中禁用的文本应呈现为“凹陷”。或者,实际上,它会起作用,但外观会与附近的其他禁用控件不同,这不好。
  • 我可以创建一个简单的 JCheckBox,其中包含第一行文本和带有第二行的 JLabel,并同时禁用它们,但单击第二行(JLabel)不会激活复选框,单击复选框会显示键盘只关注让用户感到困惑的第一行。

是否可以将复选框及其标签作为单独的控件并在它们之间建立某种链接,就像在 HTML 中一样?也许我可以用这个做点什么。

是否可以继承 JButton 并覆盖其中的某些内容,例如,更改焦点矩形的绘制方式?该矩形由 com.sun.java.swing.plaf.windows.WindowsButtonUI 绘制,但我有点害怕继承该类,因为它在标准库中太深了,我的应用程序可能会因新的 JRE 而中断。

EDIT 04.02.2015:以上适用于 Java 1.6。在 Java 1.7 及更高版本中,禁用多行复选框会改变其外观,但它看起来仍与禁用的单行复选框不同;特别是在经典 Windows 主题上,文本不会凹陷。


(来源:keep4u.ru

【问题讨论】:

  • 你应该创建你自己的类,继承 JPanel 或 JCheckBox(两者都有优点)并通过你自己的组件实现你想要的功能
  • 是否可以将复选框及其标签作为单独的控件并在它们之间建立某种链接,就像在 HTML 中一样? == JCheckBox with JLabel,编辑需要使用文本对齐(API 中的一些方法)
  • @mKorbel,不幸的是它不像在 HTML 中那样工作:鼠标单击标签不会激活复选框。显然这个功能只对辅助功能有用。

标签: java swing checkbox


【解决方案1】:

我可能遗漏了一些东西,但我只是禁用了 JCheckBox 和 JLabel。

使用 Java 1.7 和 Windows Vista。

这是代码

package com.ggl.testing;

import java.awt.BorderLayout;

import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JToggleButton;
import javax.swing.SwingUtilities;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class CheckBoxTest implements Runnable {

    private JCheckBox checkBox;

    private JLabel multiLineLabel;

    private JFrame frame;

    @Override
    public void run() {
        frame = new JFrame("Check Box Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel mainPanel = new JPanel();
        mainPanel.setLayout(new BorderLayout());

        JPanel checkBoxPanel = new JPanel();

        checkBox = new JCheckBox();
        checkBoxPanel.add(checkBox);

        String s = "<html>When in the course of human events it becomes"
                + "<br>necessary for one people to dissolve the political"
                + "<br>bands which have connected them with another and to"
                + "<br>assume among the powers of the earth, the separate"
                + "<br>and equal station to which the Laws of Nature and"
                + "<br>of Nature's God entitle them, a decent respect to the"
                + "<br>opinions of mankind requires that they should declare"
                + "<br>the causes which impel them to the separation.";
        multiLineLabel = new JLabel(s);
        multiLineLabel.setLabelFor(checkBox);
        checkBoxPanel.add(multiLineLabel);

        mainPanel.add(checkBoxPanel, BorderLayout.CENTER);

        JPanel toggleButtonPanel = new JPanel();

        JToggleButton toggleButton = new JToggleButton("Disable Checkbox");
        toggleButton.addChangeListener(new ChangeListener() {
            @Override
            public void stateChanged(ChangeEvent event) {
                JToggleButton toggleButton = (JToggleButton) event.getSource();
                if (toggleButton.isSelected()) {
                    checkBox.setEnabled(false);
                    multiLineLabel.setEnabled(false);
                } else {
                    checkBox.setEnabled(true);
                    multiLineLabel.setEnabled(true);
                }
            }
        });
        toggleButtonPanel.add(toggleButton);

        mainPanel.add(toggleButtonPanel, BorderLayout.SOUTH);

        frame.add(mainPanel);

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

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new CheckBoxTest());
    }

}

【讨论】:

  • 确实它似乎在 Java 1.7 及更高版本中工作......但并不完全。根据 L&F 和 Windows 主题,禁用的单行和多行复选框可能看起来不同。 (screenshot)
  • @Goblin Alchemist:感谢您的测试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多