我是杰森.我对Substance的外观有一点问题(https://substance.dev.java.net/).
我的问题更为笼统.我已经编写了GUI并且工作正常,但是当我使用Substance Look-and-feel时,它需要在EDT线程(事件调度线程或其他东西)中进行所有GUI初始化.
现在我正在使用com.sun.java.swing.plaf.windows.WindowsLookAndFeel(不确定我是否拼写正确)并且它不需要任何此类内容.
所以我通过调用SwingUtilities.invokeLater()将主要初始化放入EDT.这使它工作.但是,该程序在执行期间还会生成其他几个窗口.现在我的代码如下:
SomeNewWindow window = new SomeNewWindow();
// ... some bs emitted
window.doStuff();
Run Code Online (Sandbox Code Playgroud)
这段代码工作正常,因为在调用window.doStuff()时,它已经初始化了.但是Substance要求我做这样的事情:
SwingUtilities.invokeLater(new Runnable(){
public void run(){
SomeNewWindow window = new SomeNewWindow();
}});
// ... bs emitted
window.doStuff();
Run Code Online (Sandbox Code Playgroud)
这里它有时会抛出NullPointerException,因为窗口没有被时间窗口初始化.调用了doStuff().我不能将window.doStuff()放入EDT线程,因为它通常需要几秒钟才能返回并挂起GUI.
我在调用EDT线程后尝试放入Thread.sleep(1000),因为它可能已经初始化了.但这似乎很尴尬.我只需要一种方法让主线程在SomeNewWindow初始化返回时"知道",这样它就可以继续而不必担心NullPointerException.
提前致谢.
我的Swing应用程序中有一组单选按钮,它们周围有一个边框,如下所示:
radioButtonPanel.setBorder( new CompoundBorder (
BorderFactory.createTitledBorder( " Input Data " ), padBorder ) );
Run Code Online (Sandbox Code Playgroud)
我们的应用程序支持两种外观和感觉,一种浅色和深色.在两者之间切换时,边框颜色本身似乎正确地改变颜色,但文本没有.对于我的生活,我无法弄清楚组件的名称是什么,我应该设置颜色.该文档createTitledBorder()说它使用默认的外观,但我不确定它在哪里拉它的默认值.我以为是Panel.foreground,但那不是它,似乎没有别的东西看起来很正确.
有谁知道我需要在这里设置哪些外观和感觉组件?
我使用以下代码:
public final class TableCellRendererCenter extends DefaultTableCellRenderer {
public static final TableCellRenderer INSTANCE
= new TableCellRendererCenter();
protected TableCellRendererCenter() {
// Calling super
super();
this.setHorizontalAlignment(SwingConstants.CENTER);
}
}
Run Code Online (Sandbox Code Playgroud)
在JTable列上:
TableColumnModel retrMod = ChartItemsTable.getColumnModel();
TableColumn retrCol = retrMod.getColumn(2);
retrCol.setHeaderRenderer(TableCellRendererCenter.INSTANCE);
retrCol.setCellRenderer(TableCellRendererCenter.INSTANCE);
Run Code Online (Sandbox Code Playgroud)
并且外观与其他列标题不再匹配:

为什么?我该如何解决这个问题?
编辑
似乎NetBeans正在使用DefaultTableCellHeaderRenderer它来自package sun.swing.table;
我到处读到我不应该使用太阳包.Grrrr ......这没有用!
编辑2
0verbose的建议产生以下结果:

解
根据eugener的建议,我更新了我的代码如下:
public final class TableCellRendererCenter extends DefaultTableCellRenderer {
@Override
public Component getTableCellRendererComponent(
JTable table, Object value, boolean isSelected,
boolean hasFocus, int row, int column) {
// returns component used for …Run Code Online (Sandbox Code Playgroud) 我想应用我自己的关闭和最小化按钮.有没有办法改变JFrame设计?
我想创建具有现代外观的平台独立桌面应用程序(Simmilar到github桌面应用程序).是否有可能设计具有github桌面应用程序使用java提供的外观和感觉的桌面应用程序?
请先参阅github windows应用程序以供参考.因为我已经知道了java中的awt和swing,但我认为我们不能用awt或swing创建相同的外观和感觉.
提前致谢.
我有一个应用程序,它使用遍布文本和图标的自定义按钮.适用于Windows和Linux,但现在OSX用户抱怨.文本不会显示在Mac上,只是'...'.代码看起来很简单,但是当涉及到mac时我很无能为力.我怎样才能解决这个问题?
测试用例:
package example.swingx;
import example.utils.ResourceLoader;
import com.xduke.xlayouts.XTableLayout;
import javax.swing.*;
import javax.swing.plaf.ComponentUI;
import java.awt.*;
import java.awt.event.ActionEvent;
public class SmallButton extends JButton {
private static ComponentUI ui = new SmallButtonUI();
public SmallButton() {
super();
/* final RepaintManager repaintManager = RepaintManager.currentManager(this);
repaintManager.setDoubleBufferingEnabled(false);
setDebugGraphicsOptions(DebugGraphics.FLASH_OPTION);*/
}
public SmallButton(AbstractAction action) {
super(action);
}
public SmallButton(String text) {
super(text);
}
public SmallButton(Icon icon) {
super(icon);
}
public void updateUI() {
setUI(ui);
}
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JPanel …Run Code Online (Sandbox Code Playgroud) 使用Java中的Mac上的Netbeans GUI构建器构建.
这就是Netbeans中GUI的样子:

当我点击预览时,它看起来并不太糟糕,但有一些小变化:

最后,当我运行它时,它看起来像这样: - 太可怕了

我认为这与Java的"外观和感觉"有关.我试过删除它,GUI变得一团糟.那么我的选择是什么?正如你可以看到Netbeans中的所有内容一样,当我运行它时,一切都很糟糕.
有任何想法吗?花了一天时间搞乱了这一点,我至少可以说
我知道有一种SwingUtilities.updateComponentTreeUI(Component c)方法,但它不能很好地工作.例如,我有一个JFileChooser当前的外观和感觉是Windows,然后我将外观改为Nimbus SwingUtilities.updateComponentTreeUI(mainWindow),并且主窗口的样式已正确更改,但是当我用该JFileChooser.showOpenDialog(Component parent)方法显示文件选择器时,它仍然在Windows中外观和感觉.如果我使用该JPopupMenu.show(Component invoker, int x, int y)方法显示弹出对话框,也会发生同样的情况.解决这个问题的任何方法?
我的程序中有两个按钮
JButton button1 = new JButton();
button1.setText("First Button");
JButton button2 = new JButton("Second Button");
Run Code Online (Sandbox Code Playgroud)
我试图更改按钮的LaF,我可以使用以下代码更改按钮背景颜色
UIManager.put(Button.background new color(134,201,236));
Run Code Online (Sandbox Code Playgroud)
但是当我试图更改其他键值时"Button.disabled","Button[Default+Focused+Pressed].backgroundPainter"代码对我来说不起作用.有人可以帮我如何更改使用Painter的默认键值吗?
java ×10
look-and-feel ×10
swing ×9
jbutton ×2
jframe ×1
jtableheader ×1
macos ×1
netbeans ×1
nimbus ×1