这是我的代码:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Main extends JFrame implements ActionListener {
private JPopupMenu popup;
private JMenuItem red, green, blue, resetBtn;
private JButton btn = new JButton("Button");
private Container c;
public Main() {
super("Test JPopupMenu");
c = getContentPane();
c.setBackground(Color.white);
// Right Click Popup Menu
popup = new JPopupMenu();
popup.add(red = new JMenuItem("Red"));
red.addActionListener(this);
popup.add(green = new JMenuItem("Green"));
green.addActionListener(this);
popup.add(blue = new JMenuItem("Blue"));
blue.addActionListener(this);
popup.addSeparator();
popup.add(resetBtn = new JMenuItem("Reset"));
resetBtn.addActionListener(this);
addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent evt) {
if ( evt.isPopupTrigger() ) {
popup.show(evt.getComponent(), evt.getX(), evt.getY());
}
}
public void mouseReleased(MouseEvent evt){
if ( evt.isPopupTrigger() ) {
popup.show(evt.getComponent(), evt.getX(), evt.getY());
}
}
});
JPanel jpane = new JPanel();
jpane.add(btn);
c.add(jpane);
}
public void actionPerformed(ActionEvent evt) {
if ( evt.getSource() == btn ) {
JOptionPane.showMessageDialog(null, "You pressed the button!");
}
if ( evt.getSource() == red ) {
c.setBackground(Color.red);
}
if ( evt.getSource() == green ) {
c.setBackground(Color.green);
}
if ( evt.getSource() == blue ) {
c.setBackground(Color.blue);
}
if ( evt.getSource() == resetBtn ) {
c.setBackground(Color.white);
}
repaint();
}
public static void main(String[] args) {
Main app = new Main();
app.setDefaultCloseOperation(EXIT_ON_CLOSE);
app.setSize(300,300);
app.setVisible(true);
app.setResizable(false);
}
}
jpanel覆盖了我的整个jframe。我该怎么做才能使它只覆盖左上角的200px方块?我为jpanel尝试了setSize,但它不起作用。我该如何解决?
任何帮助将不胜感激。谢谢你的帮助。
答案 0 :(得分:3)
首先阅读Laying Out Components Within a Container,了解Swing如何控制组件的大小和位置
您遇到的主要问题是JFrame
默认使用BorderLayout
,这允许CENTER
组件占用容器可用的整个剩余空间。
你需要做两件事......
getPreferredSize
的{{1}}方法以返回您希望的尺寸,并且...... 例如......
JPanel
仅供参考:您可以使用JPanel jpane = new JPanel(new GridBagLayout()) {
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
};
jpane.add(btn);
c.setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.weightx = 1;
gbc.weighty = 1;
gbc.anchor = GridBagConstraints.NORTHWEST;
c.add(jpane, gbc);
方法将JPopupMenu
分配给JComponent
。这意味着您不需要使用鼠标监听器;)
答案 1 :(得分:0)
Swing使用布局管理器来定位UI元素。默认情况下,大多数swing组件使用BorderLayout布局管理器。不同的布局管理器使用不同的启发式和UI元素属性来确定它们的大小和位置。例如,BorderLayout有5个不同的区域,分别对应于北,南,东,西和中心(现在称为PAGE_START,PAGE_END,LINE_START,LINE_END和CENTER(参见http://docs.oracle.com/javase/tutorial/uiswing/layout/border.html)
边框布局会自动调整CENTER位置的任何内容以填充任何剩余空间。 “边界”位置(东,南等)的元素将尝试遵循'preferredSize'维度。
因此对您的代码稍作调整:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
public class TestMain extends JFrame implements ActionListener {
private JPopupMenu popup;
private JMenuItem red, green, blue, resetBtn;
private JButton btn = new JButton("Button");
private Container c;
public TestMain() {
super("Test JPopupMenu");
c = getContentPane();
c.setBackground(Color.white);
// Right Click Popup Menu
popup = new JPopupMenu();
popup.add(red = new JMenuItem("Red"));
red.addActionListener(this);
popup.add(green = new JMenuItem("Green"));
green.addActionListener(this);
popup.add(blue = new JMenuItem("Blue"));
blue.addActionListener(this);
popup.addSeparator();
popup.add(resetBtn = new JMenuItem("Reset"));
resetBtn.addActionListener(this);
addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent evt) {
if ( evt.isPopupTrigger() ) {
popup.show(evt.getComponent(), evt.getX(), evt.getY());
}
}
public void mouseReleased(MouseEvent evt){
if ( evt.isPopupTrigger() ) {
popup.show(evt.getComponent(), evt.getX(), evt.getY());
}
}
});
JPanel jpane = new JPanel();
jpane.setPreferredSize(new Dimension(200,200));
jpane.add(btn);
c.add(jpane, BorderLayout.NORTH);
}
public void actionPerformed(ActionEvent evt) {
if ( evt.getSource() == btn ) {
JOptionPane.showMessageDialog(null, "You pressed the button!");
}
if ( evt.getSource() == red ) {
c.setBackground(Color.red);
}
if ( evt.getSource() == green ) {
c.setBackground(Color.green);
}
if ( evt.getSource() == blue ) {
c.setBackground(Color.blue);
}
if ( evt.getSource() == resetBtn ) {
c.setBackground(Color.white);
}
repaint();
}
public static void main(String[] args) {
TestMain app = new TestMain();
app.setDefaultCloseOperation(EXIT_ON_CLOSE);
app.setSize(300,300);
app.setVisible(true);
app.setResizable(false);
}
}
我改变的事情:
希望这有帮助!