我正在学习如何使用Swing,发现自己很难完成任务.
我想要实现的目标:我希望左侧有一个面板(称之为菜单面板)(比方说100px宽度)和第二个面板(称之为内容面板),这将占用剩下的可用位置.
在菜单面板中有3个按钮.当我按下它们时,在菜单面板的右侧(在内容面板上)应出现第二个菜单面板(子菜单)(它应该在按下的按钮中间开始).
可能很难理解,所以我创建了简单的草稿:
我尝试过JLayeredPane但是调整窗口大小时出现了问题(分层窗格中的元素没有调整大小).
JLayeredPane
错过实现LayoutManager
,您必须setPreferredSize
或setBounds
手动调整大小/位置JComponents
,
ComponentListener
您可以添加一种可能的解决方法JFrame
,然后componentResized(ComponentEvent e)
您可以调整大小/替换JComponent(s)
为所需的Bounds
例如
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;
public class LayeredPaneWithOverlap {
private JTextArea textArea = new JTextArea(2, 10);
private JPanel textPanel = new JPanel(new BorderLayout());
private JTable table = new JTable(30, 5);
private JScrollPane scroll = new JScrollPane(table);
private JLayeredPane layer = new JLayeredPane();
private JFrame frame = new JFrame("Frame with resiziable JLayeredPane");
public void makeUI() {
textArea.setBorder(new LineBorder(Color.DARK_GRAY));
textArea.setText("Frame with resiziable JLayeredPane");
textPanel.setOpaque(false);
textPanel.add(textArea, BorderLayout.NORTH);
Font font = textArea.getFont();
FontMetrics fontMetrics = textArea.getFontMetrics(font);
int h = fontMetrics.getHeight() + frame.getInsets().top +
textPanel.getInsets().top + textArea.getInsets().top
+ textArea.getInsets().bottom;
scroll.setBounds(0, h, 400, 300);
layer.add(textPanel, new Integer(2));
layer.add(scroll, new Integer(1));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(600, 400);
frame.addComponentListener(new ComponentAdapter() {
@Override
public void componentResized(ComponentEvent e) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
resizeAll();
}
});
}
});
frame.setLocationRelativeTo(null);
frame.add(layer);
resizeAll();
frame.setVisible(true);
}
void resizeAll() {
Insets insets = frame.getInsets();
int w = frame.getWidth() - insets.left - insets.right;
int h = frame.getHeight() - insets.top - insets.bottom;
textPanel.setSize(w, h);
scroll.setSize(w, h - scroll.getY());
layer.revalidate();
layer.repaint();
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new LayeredPaneWithOverlap().makeUI();
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
9672 次 |
最近记录: |