- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
此问题出现在my last question here之后。我想将每个按钮聚焦和失去焦点背景设置为主菜单(ContentPane 即 JPanel)下方的背景颜色,因此按钮看起来像选项卡。它在不同的环境中可能会有所不同,因此它是动态的,所以我无法手动设置它。现在,如果我记录 ContentPane 背景,它会显示 238, 238, 238。如果我将其记录在 FocusListener 中 - 它也会显示 238, 238, 238。如果我直接将按钮的背景设置为 FocusListener 之外的 ContentPane 背景 - 它可以工作,但如果我设置在 FocusListener 内部 - 看起来值没有被读取和设置,但如果我手动设置颜色 - 它可以工作。怎么会发生这种事?将 FocusListener 设置为按钮是我在主 JPanel 初始化过程中所做的最后一件事。
private void setButtonDefaults(JButton but) {//calls once for each menu button to set defaults
but.setBorderPainted(false);
but.setBackground(Color.DARK_GRAY);
but.setForeground(Color.WHITE);
but.setName(but.getText().toLowerCase());
but.setPreferredSize(buttonSize);
but.addActionListener(this);
//add focus listener
but.addFocusListener(new FocusListener() {
@Override
public void focusLost(FocusEvent e) {
Color clr = ContentPane.getBackground();
log(clr + "");//logs that color is 238, 238, 238
JButton button = (JButton) e.getSource();
button.setBackground(clr);//value is not read
//button.setBackground(new Color(238, 238, 238)); //value is read
}
@Override
public void focusGained(FocusEvent e) {
//same as focusLost function
}
});
}
private void enableOnlyOne(JButton but) {
/* calls each time when one of menu buttons are pressed.
All buttons are unpressed and changed colors to black and one
button is set as pressed and changes background color to
ContentPane background color
*/
//disable all
setButtonDisabled(MLibrary);
setButtonDisabled(MScheduler);
setButtonDisabled(MBudget);
setButtonDisabled(MReports);
setButtonDisabled(MManage);
setButtonDisabled(MSettings);
//enable one
but.getModel().setPressed(true);
but.setBackground(ContentPane.getBackground());//value is read perfect
but.setForeground(Color.BLACK);
}
private void setButtonDisabled(JButton but) {
but.getModel().setPressed(false);
but.setBackground(Color.DARK_GRAY);
but.setForeground(Color.WHITE);
}
最佳答案
请不要这样做,因为我读过你之前的帖子......,现在我无法抗拒
更好、最简单的方法是将 ChangeListener
添加到预期的 JButtons
,然后在 stateChanged(ChangeEvent changeEvent)
中您可以确定哪个 JButtons
触发了此事件,对于事件类型,您必须从 ButtonModel
中提取此事件的类型
(其余由您决定,请将这些 JButtons
放入 Vector、Array 或 Enumerations
),例如
import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;
public class MyButtonGroup {
private JButton button1 = new JButton("Test Enabled / Disabled");
private JButton button2 = new JButton("Test Enabled / Disabled");
private JButton button3 = new JButton("Test Enabled / Disabled");
public MyButtonGroup() {
JPanel panel = new JPanel();
panel.setLayout(new GridLayout(3, 0, 10, 10));
button1.addChangeListener(changeListener);
panel.add(button1);
button2.addChangeListener(changeListener);
panel.add(button2);
button3.addChangeListener(changeListener);
panel.add(button3);
JFrame frame = new JFrame("Grouping Example");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(panel);
frame.pack();
frame.setVisible(true);
}
private ChangeListener changeListener = new ChangeListener() {
public void stateChanged(ChangeEvent changeEvent) {
JButton abstractButton = (JButton) changeEvent.getSource();
if (abstractButton == button1) {
ButtonModel buttonModel = abstractButton.getModel();
boolean armed = buttonModel.isArmed();
boolean pressed = buttonModel.isPressed();
boolean selected = buttonModel.isSelected();
boolean rolover = buttonModel.isRollover();
System.out.println("Changed: " + armed + "/" + pressed + "/" + selected + "/" + rolover);
} else if (abstractButton == button2) {
ButtonModel buttonModel = abstractButton.getModel();
boolean armed = buttonModel.isArmed();
boolean pressed = buttonModel.isPressed();
boolean selected = buttonModel.isSelected();
boolean rolover = buttonModel.isRollover();
System.out.println("Changed: " + armed + "/" + pressed + "/" + selected + "/" + rolover);
}
}
};
public static void main(String args[]) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
MyButtonGroup xxx = new MyButtonGroup();
}
});
}
}
关于java - 似乎 JPanel 背景未在 FocusListener 中读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8788696/
我目前正在研究我们小组第一学期考试项目的 GUI 部分,我遇到了一个关于回调和事件处理的奇怪问题。 有点偏离主题:我已经用谷歌搜索了这个问题,但确实找不到任何在 Java 中使用回调的具体示例,所以从
我正在尝试将 focusListener 添加到 JDateChooser,以便当用户选择 dateOfBirth 时,当焦点丢失时,它会在文本字段上显示年龄。但它不起作用这是我尝试过的方法, 导入j
我有一个 JFrame,我想在用户单击它时将其关闭。我有两个 JTextFields 和一个 JButton(用户名、密码、提交)。当我为他们提供所有 FocusListener 时,只要用户从一个字
我必须扩展一些代码来实现一个 ActionListener,该监听器使用 ActionCommands 来获取有关触发 ActionEvent 的组件所属对象的更多信息。 同一段代码现在还应该实现 F
我在 JFrame 中有 2 个文本字段,当焦点从 textfield1 丢失时,我想验证 textfield1 中的数据。因此,我在 FocusLost() 方法中使用了 FocusListener
我一直在研究有关 JInternalFrames 的各种问题,并尝试按照建议实现代码,但我似乎做错了一些事情。我在这里包含的代码将演示我的问题。三个框架已创建,但当您单击并移动它们时,它们不会按预期到
有一个 SWT 文本框。我正在为其设置默认文本。 设置焦点监听器,以便当焦点位于文本框上时,删除默认文本。 设置验证监听器以确保仅输入字母。 但是,当焦点设置在文本框上时,文本不会设置为空。是什么导致
在我的代码中,当我尝试将 FocusListener 添加到 JTextField 时,它说 ChatClient.java:30: error: incompatible types: ChatCl
我有一个文本字段,我必须在其中验证电子邮件。我的问题是,我只想在电子邮件有效时将焦点从文本字段移开。我现在使用 FocusAdapter。有人可以给我一些其他的想法吗? 最佳答案 参见javax.sw
我有 JTextField。我需要保存更改,如果用户在其中写了一些东西然后失去了焦点(比如点击其他地方) mMaxLabelLength = new JTextField(); mMaxLabelLe
import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.util.*; import java.ne
我创建了一个使用 FocusListener 来确保文本字段的值始终为正的应用程序。当用户输入负值,然后单击“tab”键将焦点从文本字段移开时,该值将乘以-1,从而得到正值。但是,当我运行该应用程序时
一些背景:我是一个相当有经验的 C++ 程序员,但我目前正在自学 Java。 我有一个包含多个 JTextField 的应用程序,我希望在单击某个字段时突出显示该字段的内容。我知道我可以为每个人编写一
我有以下代码: Display display = new Display(); Shell shell = new Shell(display); s
首先:抱歉,我无法提供 SSCCE。我试图在一个小项目上重现这个问题,但没有成功,或者我应该说成功了,因为它在那里工作! 所以这是我的问题:我有一个可编辑的 JCombobox,它应该通过单击编辑器组
此问题出现在my last question here之后。我想将每个按钮聚焦和失去焦点背景设置为主菜单(ContentPane 即 JPanel)下方的背景颜色,因此按钮看起来像选项卡。它在不同的环
我有一个文本框,我想在文本框获得焦点时显示一个对话框。所以我写了以下代码。但是当对话框被处理后,对话框会再次出现。我尝试使用换行符进行调试和检查。那次它不会执行多次,但在正常模式下它会执行多次,因此对
因此,当我单击 JTextfield 中的一个时,我想setText一个名为value的字符串。我读到有关将 FocusListener 添加到 JTextField 的内容,但找不到有关将其添加到
我有两个实现 KeyListener 和 FocusListener 接口(interface)的类。两者都不起作用,但如果我不通过注释或删除以下内容来添加 JButton:add(whiteJBut
我的 Java 应用程序中有数百个 JTextFields,我想在所有这些上添加 FocusListener 以设置文本的水平对齐并在每个文本字段上添加 FocusListener。所以,我做了这个方
我是一名优秀的程序员,十分优秀!