【发布时间】:2015-06-20 06:41:55
【问题描述】:
我正在尝试创建一个具有JXTaskPane 的 GUI,其中一个 HTML 编辑器窗格显示一些冗长的文本,然后在其下方是两个滑块。一个应该有整个窗口宽度在标签和滑块之间划分为 50/50,下一个滑块应该有标签宽度的 1/3 和滑块的 2/3。
要运行此示例,您需要 SwingX,download the jar here。
代码有几个问题:
- 第一次启动时,元素未正确绘制。需要调整窗口大小,或者关闭并重新打开任务窗格。谁能推荐一种方法来解决这个问题?
- 即使
GridBagConstraint填充参数设置为使用全水平宽度,组件也只使用了大约一半的窗口宽度并在中心绘制。如何让他们使用JXTaskPane的全宽和全高? - 尽管
slider2将其gridwidth属性设置为2(标签将其设置为1),但实际上它比其标签更窄!为什么这样做?我尝试使用weightx参数,但这只是将外观随机更改为更宽或更窄,但似乎是一种随机且相当不可预测的方式。如何使此标签为其滑块宽度的 1/3?
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import org.jdesktop.swingx.JXTaskPane;
class test {
public static void main(String[] arg) {
JFrame mainWindow = new JFrame();
JXTaskPane taskPane = new JXTaskPane();
JSlider slider1 = new JSlider(0,100,50);
JSlider slider2 = new JSlider(0,100,50);
taskPane.setCollapsed(false);
// slider 1 with its label in a simple GridLayout
JPanel pnlSlider1 = new JPanel();
pnlSlider1.setLayout(new GridLayout(1,1)); // 1 row, 1 column
pnlSlider1.add(new JLabel("Description for slider1"));
pnlSlider1.add(slider1);
// slider 2 with its label is in a GridBagLayout, the label should be 1/3 of the width of the slider
JPanel pnlSlider2 = new JPanel();
pnlSlider2.setLayout(new GridBagLayout());
GridBagConstraints c2 = new GridBagConstraints();
c2.fill = GridBagConstraints.HORIZONTAL;
c2.gridx = 0;
c2.gridy = 0;
c2.gridwidth = 1;
c2.weighty = 1;
c2.weightx = 1;
pnlSlider2.add(new JLabel("Description for slider2"), c2);
c2.gridx = 1;
c2.gridwidth = 2;
c2.weightx = 1;
pnlSlider2.add(slider2, c2);
// label should now be to the left of slider
String content = "<html>Some rather long winded HTML content Some rather long winded HTML content Some rather long winded HTML content Some rather long winded HTML content ";
content += "Some rather long winded HTML content Some rather long winded HTML content Some rather long winded HTML content Some rather long winded HTML content Some rather long winded HTML content";
content += "Some rather long winded HTML content Some rather long winded HTML content Some rather long winded HTML content </html>";
JEditorPane ep = new JEditorPane("text/html", content);
// this is the main window panel
//JPanel panel = new JPanel();
taskPane.setLayout(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
c.fill = GridBagConstraints.HORIZONTAL;
c.gridx = 0;
c.gridy = 0;
taskPane.add(ep, c);
c.gridy = 1;
taskPane.add(pnlSlider1, c);
c.gridy = 2;
c.insets = new Insets(10,0,0,0);
taskPane.add(pnlSlider2, c);
// tie it all together and display the window
mainWindow.setPreferredSize(new Dimension(600, 600));
mainWindow.setLocation(100, 100);
mainWindow.getContentPane().add(taskPane);
mainWindow.pack();
mainWindow.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
mainWindow.setVisible(true);
}
}
【问题讨论】:
-
你可以通过截图或图片发布示例输出
-
这是初始加载窗口的样子:inside.net/files/panel1.png,这是调整大小后的样子:inside.net/files/panel2.png。请注意控件周围的巨大空间,以及滑块/label2 的不正确间距。
-
"为了让这个例子运行,你需要 SwingX" 如果可能的话,最好用 Swing 中的单个组件替换 3rd 方 API,例如代码,它是通常可能是布局问题..
标签: java swing layout-manager gridbaglayout swingx