gpt4 book ai didi

java可扩展的JDialog

转载 作者:行者123 更新时间:2023-11-30 07:05:16 25 4
gpt4 key购买 nike

对于我的应用程序,我有一个 JDialog,它包含一个带有一些基本 JTextFieldsJButtonsJPanel。这个想法是用一个按钮来扩展 JDialog 以显示第二个 JPanel,其中包含一些“高级”设置。

我通过调用 setPreferredSize()pack() 实现了这一点,但这不是很优雅。一个“优雅”的解决方案是将第二个 Panel 以某种方式设置为 null,因此当切换状态处于“缩回”时被 pack() 忽略。

抱歉,我无法为您提供代码(那东西大约有 700 个谎言),但就像我说的,基本上是 JDialog 中的两个 JPanel。

这里有一些图片:

enter image description here enter image description here

问题:有没有什么技巧可以让这个展开的东西在不必为展开/正常状态设置固定尺寸的情况下进行。

最佳答案

可能有几种方法可以做到这一点,例如,您可以根据需要简单地添加和删除底部面板。如果可以的话,我想避免这种情况,因为它会使布局管理变得更加困难。

另一种解决方案是简单地使组件可见/不可见,但您需要找到一个布局管理器,它实际上会将不可见组件视为不存在 (0x0) - 是的,我有一起进行测试时与一对夫妇的问题...

Flip

import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class FlipDialog {

public static void main(String[] args) {
new FlipDialog();
}

public FlipDialog() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}

JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}

public class TestPane extends JPanel {

private JButton flip;
private JPanel bottom;

public TestPane() {
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.insets = new Insets(8, 8, 8, 8);
gbc.gridwidth = GridBagConstraints.REMAINDER;
JPanel top = new JPanel();
flip = new JButton("+");
top.add(flip);
add(top, gbc);

bottom = new JPanel();
bottom.add(new JLabel("Boo"));
bottom.setVisible(false);

add(bottom, gbc);

flip.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
bottom.setVisible(!bottom.isVisible());
if (bottom.isVisible()) {
flip.setText("-");
} else {
flip.setText("+");
}
revalidate();
Window window = SwingUtilities.windowForComponent(bottom);
window.pack();
}
});
}

}

}

应该注意的是,调用 revalidate 可能是无关紧要的,因为无论如何您都在打包窗口

更新了布局示例

Closed Opended

import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.AbstractSpinnerModel;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.EmptyBorder;
import javax.swing.border.TitledBorder;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class Test100 {

public static void main(String[] args) {
new Test100();
}

public Test100() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}

JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new SearchPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}

public class SearchPane extends JPanel {

private ObjectsPane objectsPane;
private AdvanceSettingsPane advanceSettingsPane;

public SearchPane() {
setBorder(new EmptyBorder(8, 8, 8, 8));
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.weightx = 1;
gbc.weighty = 1;
gbc.fill = GridBagConstraints.BOTH;

objectsPane = new ObjectsPane();
add(objectsPane, gbc);

gbc.gridy++;
gbc.weighty = 0;

advanceSettingsPane = new AdvanceSettingsPane();
advanceSettingsPane.setVisible(false);
add(advanceSettingsPane, gbc);

objectsPane.addExpandCollapseListener(new ChangeListener() {

@Override
public void stateChanged(ChangeEvent e) {
System.out.println(objectsPane.isExpanded());
advanceSettingsPane.setVisible(objectsPane.isExpanded());
Window window = SwingUtilities.windowForComponent(SearchPane.this);
window.pack();
}
});
}

public class ObjectsPane extends JPanel {

private JSpinner findField;
private JTextField replaceField;

private JButton expandButton;
private JButton replaceButton;
private JButton replaceAllButton;

private boolean expanded = false;

public ObjectsPane() {
setLayout(new GridBagLayout());

findField = new JSpinner(new AbstractSpinnerModel() {

@Override
public Object getValue() {
return "";
}

@Override
public void setValue(Object value) {
}

@Override
public Object getNextValue() {
return "";
}

@Override
public Object getPreviousValue() {
return "";
}
});
replaceField = new JTextField(10);

replaceButton = new JButton("Replace");
replaceAllButton = new JButton("Replace All");
expandButton = new JButton("+");

GridBagConstraints gbc = new GridBagConstraints();
gbc.insets = new Insets(4, 4, 4, 4);
gbc.gridx = 0;
gbc.gridy = 0;
gbc.gridwidth = GridBagConstraints.REMAINDER;
gbc.weightx = 1;
gbc.anchor = GridBagConstraints.WEST;
add(new JLabel("Objects found:"), gbc);

gbc.gridx = 0;
gbc.gridy = 1;
gbc.gridwidth = 1;
gbc.weightx = 0;
add(new JLabel("Find:"), gbc);

gbc.gridy = 2;
add(new JLabel("Replace:"), gbc);

gbc.gridx = 1;
gbc.gridy = 1;
gbc.weightx = 1;
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridwidth = GridBagConstraints.REMAINDER;
add(findField, gbc);

gbc.gridy = 2;
add(replaceField, gbc);

gbc.anchor = GridBagConstraints.WEST;
gbc.gridwidth = 1;
gbc.weightx = 0;
gbc.gridx = 0;
gbc.gridy = 3;
gbc.fill = GridBagConstraints.NONE;
add(expandButton, gbc);

JPanel pnlButtons = new JPanel(new GridLayout(1, 2));
pnlButtons.add(replaceButton);
pnlButtons.add(replaceAllButton);

gbc.gridx = 1;
gbc.gridy = 3;
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.weightx = 1;
gbc.gridwidth = GridBagConstraints.REMAINDER;
add(pnlButtons, gbc);

expandButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
expanded = !expanded;
if (expanded) {
expandButton.setText("-");
} else {
expandButton.setText("+");
}
fireStateChanged();
}
});
}

public boolean isExpanded() {
return expanded;
}

public void addExpandCollapseListener(ChangeListener listener) {
listenerList.add(ChangeListener.class, listener);
}

public void removeExpandCollapseListener(ChangeListener listener) {
listenerList.remove(ChangeListener.class, listener);
}

protected void fireStateChanged() {
ChangeListener[] listeners = listenerList.getListeners(ChangeListener.class);
if (listeners.length > 0) {

ChangeEvent evt = new ChangeEvent(this);
for (ChangeListener listener : listeners) {
listener.stateChanged(evt);
}

}
}

}

public class AdvanceSettingsPane extends JPanel {

public AdvanceSettingsPane() {
setBorder(new TitledBorder("Advance Settings"));
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
// gbc.gridy = 0;
gbc.weightx = 1;
gbc.anchor = GridBagConstraints.WEST;
gbc.gridwidth = GridBagConstraints.REMAINDER;

add(new JCheckBox("Live Update"), gbc);
add(new JCheckBox("Word search"), gbc);
add(new JCheckBox("Ignore Case"), gbc);
}

}

}

}

关于java可扩展的JDialog,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26876827/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com