Java Swing JXTaskPane:如何设置背景和边框?

yan*_*niv 3 java swing swingx jxtaskpane

我编写了以下示例代码:

import org.jdesktop.swingx.*;
import javax.swing.*;
import java.awt.*;

public class TaskPaneExample{
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new TaskPaneExample();
            }});
        }

        public TaskPaneExample() {
            JFrame frame = new JFrame("TaskPane Example 1");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.add(doInit(), BorderLayout.CENTER);
            frame.setLocationRelativeTo(null);
            frame.pack();
            frame.setVisible(true);
        }

        private Component doInit() {
            JXTaskPaneContainer taskpanecontainer = new JXTaskPaneContainer();
            taskpanecontainer.setLayout(new VerticalLayout(2));

            final JXTaskPane taskpane1 = new JXTaskPane(){
                public void setCollapsed(boolean w){
                    super.setCollapsed(w);
                }};
            taskpane1.setTitle("First TaskPane");
            JPanel panel1 = new JPanel();
            panel1.setBackground(Color.red);
            panel1.setSize(100,100);
            taskpane1.add(panel1);
            taskpanecontainer.add(taskpane1);

            JXTaskPane taskpane2 = new JXTaskPane(){
                public void setCollapsed(boolean w){
                    super.setCollapsed(w);
                }};
            taskpane2.setTitle("My Tasks");
            JPanel panel2 = new JPanel();
            panel2.setBackground(Color.blue); 
            panel2.setSize(100,100);
            taskpane2.add(panel2);
            taskpanecontainer.add(taskpane2);
            taskpanecontainer.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));

            return taskpanecontainer;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我需要的是两件事:

  1. 如何更改标题的背景颜色?我认为这是通过该taskpane2.setUI(..)选项完成的,但我没有运气使用它。
  2. JXTaskPane如何将和之间的边界设置Jpanel为零?

kle*_*tra 5

最初,JXTaskPane 被设计为一种“固定属性”组件 - 它应该看起来与相应的本机组件(当时的 WinXP)完全相同:不支持自定义外观。因此,标题/边框的实现深深地隐藏在 XXTaskPaneUI 中 - 实际上,一切都归结为边框。

1) 正如dogbane 已经提到的,一些属性可以根据每个应用程序进行更改。请注意:这些是实现细节,可能会更改或不受具体 ui 实现的支持(Nimbus 始终是不尊重它们的好候选者,即使我们的非真正合成实现也可能不会,忘记了)

2)“gap”是contentPane的边框,你可以自己设置。再次注意:可能无法在 updateUI 中幸存(可能是 ui 委托无条件覆盖它们,如果是这样,请在 SwingX 问题跟踪器中提交问题)

((JComponent) taskpane2.getContentPane()).setBorder(BorderFactory.createEmptyBorder());
Run Code Online (Sandbox Code Playgroud)

顺便说一句:那些 panel.setSize 完全没有效果 -layoutManagers 规则;-)