- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在为 JComboBox
编写自定义 ListCellRenderer
。为此,我使用一个系统在 L&F 更改时获取新的渲染器,并将方法委托(delegate)给它。这适用于所有 L&F。但是,当我将此组件放在面板中时(这样我可以添加更多组件),它在 Metal 和 Windows L&F 中运行良好,但 JComboBox
文本在 Motif 中消失了。看截图和代码:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class TextDemo extends JPanel implements ActionListener {
private static JFrame frame;
public TextDemo() {
super(new GridBagLayout());
JComboBox correct = new JComboBox(new String[]{"One", "Two", "Three"});
JComboBox alsoCorrect = new JComboBox(new String[]{"One", "Two", "Three"});
alsoCorrect.setRenderer(new MyRenderer());
JComboBox incorrect = new JComboBox(new String[]{"One", "Two", "Three"});
incorrect.setRenderer(new NotWorkingRenderer());
JButton button = new JButton("Change LnF");
button.addActionListener(this);
add(correct, getConstraints(0));
add(alsoCorrect, getConstraints(1));
add(incorrect, getConstraints(2));
add(button, getConstraints(3));
}
private GridBagConstraints getConstraints(int y) {
GridBagConstraints c = new GridBagConstraints();
c.gridx = 0; c.gridy = y;
c.insets = new Insets(4,8,4,8);
c.weightx = 1.0; c.weighty = 1.0;
c.fill = GridBagConstraints.HORIZONTAL;
c.anchor = GridBagConstraints.FIRST_LINE_START;
return c;
}
@Override
public void actionPerformed(ActionEvent ev) {
try {
UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel");
SwingUtilities.updateComponentTreeUI(frame);
} catch (Exception ex) {
ex.printStackTrace();
}
}
private static void createAndShowGUI() {
frame = new JFrame("TextDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TextDemo());
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
class MyRenderer implements ListCellRenderer {
protected static ListCellRenderer delegate;
static {
refreshRenderers();
UIManager.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (evt.getPropertyName().equals("lookAndFeel")) {
refreshRenderers();
}
}
});
}
protected static void refreshRenderers() {
delegate = new JComboBox().getRenderer();
}
@Override
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {
return delegate.getListCellRendererComponent(list, value,
index, isSelected, cellHasFocus);
}
}
class NotWorkingRenderer extends MyRenderer {
private JPanel panel = new JPanel();
public NotWorkingRenderer() {
panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));
}
@Override
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {
Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
c.setMaximumSize(new Dimension(Short.MAX_VALUE, Short.MAX_VALUE));
panel.removeAll();
panel.add(c);
return panel;
}
}
如果能帮助理解为什么会发生这种情况,我们将不胜感激!
最佳答案
不是答案,
但看看会发生什么,使用 JPanel 作为 JComboBox 的渲染器 JComponents
您确定带有 String 值的 JPanel 是正确的方法吗,请问目标是什么,
用默认的JLabel, (J)Component代替JPanel有没有一样的效果
来自代码
import java.awt.*;
import java.awt.event.*;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.*;
public class TextDemo extends JPanel implements ActionListener {
private static JFrame frame;
public TextDemo() {
super(new GridBagLayout());
JComboBox correct = new JComboBox(new String[]{"One", "Two", "Three"});
JComboBox alsoCorrect = new JComboBox(new String[]{"One", "Two", "Three"});
alsoCorrect.setRenderer(new MyRenderer());
JComboBox incorrect = new JComboBox(new String[]{"One", "Two", "Three"});
incorrect.setRenderer(new NotWorkingRenderer());
JButton button = new JButton("Change LnF");
button.addActionListener(this);
add(incorrect, getConstraints(0));
add(correct, getConstraints(1));
add(alsoCorrect, getConstraints(2));
add(button, getConstraints(3));
}
private GridBagConstraints getConstraints(int y) {
GridBagConstraints c = new GridBagConstraints();
c.gridx = 0;
c.gridy = y;
c.insets = new Insets(4, 8, 4, 8);
c.weightx = 1.0;
c.weighty = 1.0;
c.fill = GridBagConstraints.HORIZONTAL;
c.anchor = GridBagConstraints.FIRST_LINE_START;
return c;
}
@Override
public void actionPerformed(ActionEvent ev) {
try {
UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
SwingUtilities.updateComponentTreeUI(frame);
} catch (Exception ex) {
ex.printStackTrace();
}
}
private static void createAndShowGUI() {
frame = new JFrame("TextDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TextDemo());
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
try {
UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel");
//SwingUtilities.updateComponentTreeUI(frame);
} catch (Exception ex) {
ex.printStackTrace();
}
javax.swing.SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
createAndShowGUI();
}
});
}
}
class MyRenderer implements ListCellRenderer {
protected static ListCellRenderer delegate;
static {
refreshRenderers();
UIManager.addPropertyChangeListener(new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
if (evt.getPropertyName().equals("lookAndFeel")) {
refreshRenderers();
}
}
});
}
protected static void refreshRenderers() {
delegate = new JComboBox().getRenderer();
}
@Override
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {
return delegate.getListCellRendererComponent(list, value,
index, isSelected, cellHasFocus);
}
}
class NotWorkingRenderer extends MyRenderer {
private JPanel panel = new JPanel();
public NotWorkingRenderer() {
panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));
}
@Override
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {
Component c = super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
c.setMaximumSize(new Dimension(Short.MAX_VALUE, Short.MAX_VALUE));
panel.add(c);
return panel;
}
}
EDIT_1st。
除 ModifL&F 外的所有标准 L&F 均正确显示
向前一步???,代码行incorrect.setEditable(true);
生成
EDIT_2nd。
我是盲人 class NotWorkingRenderer extends MyRenderer {
, pip... pip... pip...
phaaa 我从未参与过 add
/remove
/modify
JComponent
在 Xxx(Xxx)Renderer
中,但是关于是否可能,
class NotWorkingRenderer extends BasicComboBoxRenderer {
private JPanel panel = new JPanel();
public NotWorkingRenderer() {
panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));
//panel.setOpaque(false);
}
@Override
public Component getListCellRendererComponent(JList list, Object value,
int index, boolean isSelected, boolean cellHasFocus) {
JLabel c = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
c.setMaximumSize(new Dimension(Short.MAX_VALUE, Short.MAX_VALUE));
panel.removeAll();
panel.add(c);
panel.revalidate();
panel.repaint();
return panel;
}
}
关于Java Swing - 在 Motif L&F 的自定义组合框渲染器中消失文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18536082/
我的应用程序中有一个滚动窗口,我在其中创建了一个绘图区域小部件。在绘图区,我放置了多张图片。当用户在搜索框中输入有关图像的信息时,相应的图像会突出显示。 我的问题是如何在用户不使用滚动条的情况下让应用
我正在学习 Julia,但在 R 之外的编程经验相对较少。我直接从 rosalind.info 解决这个问题,你可以找到它 here如果您想了解更多详细信息。 我给了两个字符串:一个基序和一个序列,其
我使用以下代码: UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel"); 我想覆盖MotifBorder
当用户单击主题窗口(小部件)的关闭框时,如何拦截,以及如何防止 Motif 窗口管理器在单击关闭框时关闭整个调用应用程序(以便我的应用程序可以关闭Motif 应用程序上下文和窗口并继续运行)?我试图通
我想使用 XmCreate{Error|Warning|Info}Dialog 在我的基于 SDL 的应用程序的主窗口打开并且任何程序数据可用之前在屏幕上显示一些消息。我希望打开对话框,打印预期的消息
我知道罗莎琳德挑战有解决方案,但我不希望它们破坏乐趣。我以为我找到了“寻找共享主题”的解决方案,但我的答案始终是错误的。 问题是在给定的工作表中找到最长的公共(public)子字符串,该工作表由以“>
使用 Motif 工具包,我们可以使用 API“XmCreateArrowButton”创建箭头按钮。 现在,当单击箭头按钮时,该按钮将被选中并保持选中状态。箭头按钮周围画有黑色边框。 有没有一种方法
我是 C 和 Linux 中的 GUI 编程的新手,我很难使用它。这似乎是一件相当简单/直接的事情,但我无法通过谷歌搜索找到任何答案。我想为小部件添加背景颜色。 XmNbackground 似乎是我想
我正在处理一个旧的 Motif 应用程序,它需要加载和显示一长串条目(大约 1500 个)。它通过 XtVaCreateManagedWidget() 创建和管理 xmFormWidgetClass
我有一个在 Raspberry Pi 上运行的 Motif 应用程序。出于调试目的,我在我的 PC 上使用 X Windows 服务器,并通过 Putty 使用 SSH 隧道 X。可能还值得注意的是,
我是 Motif 编程的新手,我想使用 UTF-8 编码。 我试过 XtSetLanguageProc (NULL, NULL, NULL); 但是当我在 Motif 中读取文件时(在 6A volu
我对 MOTIF 编程很感兴趣。 一个问题: 在 Motif GUI 编程中,操作会自动转换并通过 Internet 联网到其他客户端,而无需网络编程,这对吗? 命令是否由X11系统和协议(proto
如何创建没有标题栏 的对话框。我想使用创建 motif 对话框/小部件XtVaCreateMangedWidget 和 XtVaCreateWidget 没有标题栏以及如何创建相同的全屏对话框? 最佳
我有一个在 Linux 上运行的基于主题的应用程序。最近我一直在尝试在 motif 应用程序中创建和启动 gtk 对话框。 但是我注意到这两个工具包不兼容。如果我将 gtk 对话框移到基于主题的应用程
任何人都可以看到我做了什么导致了NullPointerException(下面的堆栈跟踪)吗? 面板显示正常: 文本输出 os.name: Windows Vista os.version:
是否可以从 Motif 中的 BulletinBoard 小部件中删除关闭按钮?或者,或者,附加一个回调函数?我知道我可以为顶层小部件执行此操作,但似乎无法为 BulletinBoard 执行此操作。
如何创建没有系统菜单、最小化和最大化框的 Motif 主窗口?我只是无法通过谷歌搜索和阅读文档和教程来找到方法。我相信为 XtVaCreateManagedWindow 使用一些额外的参数应该是可能的
我正在做一个关于将遗留 GUI 程序从 Motif 迁移到 Gtk 的项目。源代码很长(大约 80k 行)。现在我有两个计划: 简单地找到Motif函数和Gtk函数之间的对应关系。然后编写一些脚本来自
我目前正在为 JComboBox 编写自定义 ListCellRenderer。为此,我使用一个系统在 L&F 更改时获取新的渲染器,并将方法委托(delegate)给它。这适用于所有 L&F。但是,
我有一个用 Xt(X Tools Intrinsic 库)编写的名为 XClient 的类,用于设置多套接字连接。这个 XClient 类用于 OSF/Motif GUI 以扩展 XClient(因此
我是一名优秀的程序员,十分优秀!