我想在JTabbedPane中自定义选项卡的外观.
我想从最简单和最简洁的行为开始:没有边界,纯色.
问题是仍然存在不稳定性:标签略微重叠.

您会看到,自从选择了第二个选项卡后,它就会"脱颖而出".这是通过略微的边缘重叠来实现的.是否有(非常棘手的)方法来禁用此行为?
简单,可测试(只修复导入)代码:
public class TabbedPane_LookStudy extends JFrame{
public static void main(String [] args) throws UnsupportedLookAndFeelException {
UIManager.setLookAndFeel(new NimbusLookAndFeel());
new TabbedPane_LookStudy().setVisible(true);
}
public TabbedPane_LookStudy() {
JTabbedPane tp = new JTabbedPane();
tp.setUI(new MyTabbedPaneUI());
add(tp);
tp.addTab("first",new JPanel());
tp.addTab("second", new JPanel());
tp.addTab("third", new JPanel());
setPreferredSize(new Dimension(180,100));
pack();
}
public static class MyTabbedPaneUI extends javax.swing.plaf.basic.BasicTabbedPaneUI {
@Override
protected void paintTab(Graphics g, int tabPlacement, Rectangle[] rects,
int tabIndex, Rectangle iconRect, Rectangle textRect) {
Color savedColor = g.getColor();
g.setColor(Color.PINK);
g.fillRect(rects[tabIndex].x, rects[tabIndex].y,
rects[tabIndex].width, rects[tabIndex].height);
g.setColor(Color.BLUE); …Run Code Online (Sandbox Code Playgroud) 想要重新标记标记或拇指JSlider而不是标准灰色.我怎样才能做到这一点?
所以,我的问题归结为这个...默认的分隔符有点难看,而且我想为它添加一个标签(在I-want-text-on-it意义上,而不是在"添加JLabel"它的布局"感觉".我看到您可以更改拆分窗格分隔符上的边框,但是当我这样做时,它会删除我想要保留的单触箭头.
有关我如何兼顾两者的任何想法?
这是一个SSCCE,它演示了默认行为以及更改分隔符边框时发生的情况:
import javax.swing.*;
import javax.swing.plaf.basic.BasicSplitPaneDivider;
import javax.swing.plaf.basic.BasicSplitPaneUI;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class SplitPaneFun {
public static void main(String[] args) {
//Here I'm messing around with the divider look. This seems to remove the one-touch arrows. These blocked-out lines illustrate
// what I'm doing to modify the divider's border. Does this look right?:
//------------------------------------------------------------------------------------------------
JSplitPane withCustomDivider = new JSplitPane(JSplitPane.VERTICAL_SPLIT, new JPanel(), new JPanel());
BasicSplitPaneDivider divider = ( (BasicSplitPaneUI) withCustomDivider.getUI()).getDivider();
withCustomDivider.setOneTouchExpandable(true);
divider.setDividerSize(15);
divider.setBorder(BorderFactory.createTitledBorder(divider.getBorder(), "Custom border title -- …Run Code Online (Sandbox Code Playgroud) 我想知道如何JFrame在最新版本的Java中获得透明.
目前,您只能使用
<JFrame>.setOpacity();
Run Code Online (Sandbox Code Playgroud)
如果框架没有装饰.
我没有使用未装饰的框架,所以我想知道如何绕过这个限制并设置框架的不透明度,0.5f同时仍然保持标题栏,调整大小选项等.
我在这里阅读了文档:http://docs.oracle.com/javase/tutorial/uiswing/misc/trans_shaped_windows.html.该代码仅适用于Java 6,不再运行.正如我所说,错误是:
Exception in thread "AWT-EventQueue-0" java.awt.IllegalComponentStateException: The frame is decorated
at java.awt.Frame.setOpacity(Frame.java:960)
at TranslucentWindowDemo$1.run(TranslucentWindowDemo.java:53)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
...
Run Code Online (Sandbox Code Playgroud)
我也尝试(setBackground : Color)使用Color自定义Alpha值(new Color(int, int, int, Alpha))设置背景但它会抛出完全相同的错误.设置JPanel这种方式的跨性别是行不通的,因为它仍然存在JFrame,这是不透明的.
我找不到正确解决此问题的Stack Overflow上的其他答案.事实上,一些人认为这可以通过以下方式解决:
JFrame.setDefaultLookAndFeelDecorated(true);
Run Code Online (Sandbox Code Playgroud)
但他们误解了可能是指Java 7,因为我测试了它,结果是一样的.
我也尝试手动设置外观:
try {
for (final LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch [...]
Run Code Online (Sandbox Code Playgroud)
将此与上面提出的解决方案相结合也行不通. …
我有一个JButton我想将背景颜色改为白色.使用金属外观时,我可以达到预期的效果setBackground:

不幸的是,使用Windows LAF时"背景颜色"的概念是不同的; 背景颜色是按钮周围绘制的颜色:

我想使用Windows LAF,但允许将此按钮的颜色JButton更改为白色.我该怎么做呢?
我创建了自己的MyScrollbarUI类,在我的应用程序中有一个自定义滚动条外观.现在我必须这样做
scrollPane.getHorizontalScrollBar().setUI(new MyScrollbarUI());
scrollPane.getVerticalScrollBar().setUI(new MyScrollbarUI());
Run Code Online (Sandbox Code Playgroud)
在ScrollPane我使用的任何.
是否有可能告诉Swing它应该MyScrollbarUI在任何滚动条上使用它.也许通过UIManager?
我计划开发一个允许管理客户端数据的桌面应用程序.我是一名经验丰富的Java程序员,但我从来没有真正能够在Java中使用有吸引力的界面,例如,我个人认为默认的Swing组件非常糟糕(当我将它与例如最近的Web界面进行比较时).
所以第一个问题是,如何在Java中创建性感的界面(仍在所有平台上运行)?其次,在HTML5中创建界面不是一个好主意吗?是不是可以在没有Web服务器的情况下运行HTML5接口,因为我不需要在线访问应用程序,因此我不需要服务器.
我使用最新的Eclipse和GWT Designer来用Java创建swing应用程序.我的应用程序窗口中的主要功能(这是一个javax.swing.JFrame)在工具生成的auto中如下所示:
/* launch the application */
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
AppWindow window = new AppWindow();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
Run Code Online (Sandbox Code Playgroud)
这似乎是围绕着这可能是一个很大的噪音:
public static void main(String[] args) {
try {
AppWindow window = new AppWindow();
window.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
我已经读过在某些情况下需要EventQueue.InvokeLater技术,另一个问题是在这里询问使用它的位置.
我的问题更简单; 为什么在代码生成器中会自动执行此操作?为什么main应该快速返回并让事件队列稍后创建应用程序窗口?难道不会阻止这一点吗?为什么JFrame自动生成的设计器会执行此EventQueue?我试图在启动和显示表单方面看到一些不同,无论这个代码是以更简单的方式还是更难的方式完成,我只能暂时断定这有一些好处,这些好处在初学者制作的小型演示应用程序中不可见像我一样,也许在现实世界的大型复杂Jframe类中,这种延迟/排队策略有一些好处吗?
java ×10
swing ×10
java-8 ×1
jbutton ×1
jframe ×1
jslider ×1
jsplitpane ×1
jtabbedpane ×1
lf ×1
scrollbar ×1
substance ×1
swt ×1
transparency ×1