在我的图形分配中,我无法设置面板的背景颜色。如果我将ColorPanel放入另一个面板,面板背景的颜色会发生变化,但是如果更改面板的大小,则圆圈不会移动。在我的作业中,如果我改变框架的大小,则要求圆圈位于框架的中心
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class ColorMenuFrame extends JFrame {
private JMenu colorMenu = new JMenu("Colors");
private ColorPanel p = new ColorPanel();
public ColorMenuFrame(){
p.setPreferredSize( new Dimension( 100, 100 ) );
this.add(p);
}
// Main Method
public static void main(String[] args) {
ColorMenuFrame frame = new ColorMenuFrame();
frame.pack();
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
//ColoRpanel class
public class ColorPanel extends JPanel {
private int diameter;
public ColorPanel() {
// Creating Colors JMEnuBar
JMenuBar menuBar = new JMenuBar();
setJMenuBar(menuBar);
JMenu colorMenu = new JMenu("Colors");
menuBar.add(colorMenu);
// Creating Background and Foreground menus
JMenu backGroundMenu = new JMenu("BackGround");
JMenu foreGroundMenu = new JMenu("ForeGround");
// Items inside the Background and Foreground menus
JMenuItem redItem = new JMenuItem("Red");
JMenuItem greenItem = new JMenuItem("Green");
JMenuItem blueItem = new JMenuItem("Blue");
JMenuItem redItem1 = new JMenuItem("Red");
JMenuItem greenItem1 = new JMenuItem("Green");
JMenuItem blueItem1 = new JMenuItem("Blue");
// Adding Red, Green and Blue Items to backGround menu
backGroundMenu.add(redItem);
backGroundMenu.add(greenItem);
backGroundMenu.add(blueItem);
// Adding Red, Green and Blue Items to ForeGround menu
foreGroundMenu.add(redItem1);
foreGroundMenu.add(greenItem1);
foreGroundMenu.add(blueItem1);
// Adding backGround and foreground sub menus to main Menu Bar Colors
colorMenu.add(backGroundMenu);
colorMenu.add(foreGroundMenu);
//Calling ActionListeners
// Calling ActionListner after clicking on Red button
redItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
setBackground(Color.RED);
repaint();
}
});
// Calling ActionListner after clicking on Green button
greenItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
setBackground(Color.GREEN);
repaint();
}
});
// Calling ActionListner after clicking on blue button
blueItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
setBackground(Color.BLUE);
repaint();
}
});
// Calling ActionListner after clicking on Red button
redItem1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
setForeground(Color.RED);
repaint();
}
});
// Calling ActionListner after clicking on Green button
greenItem1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
setForeground(Color.GREEN);
repaint();
}
});
// Calling ActionListner after clicking on Green button
blueItem1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
setForeground(Color.BLUE);
repaint();
}
});
}
//Paint Component Method, to create circle at the center of panel
protected void paintComponent(Graphics g){
int width = getSize().width;
int height =getSize().height;
if (width <= height){
diameter = width / 2;
}
else if (height <= width){
diameter = height / 2;
}
int r = diameter / 2;
int x = (width / 2) - r;
int y = (height / 2)- r;
//Drawing Circle
g.fillOval(x, y, diameter, diameter);
}
}
}
答案 0 :(得分:1)
不要忘记在super.paintComponent(g)
方法覆盖中调用paintComponent
。在第一行做它。
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
// ....
这将告诉JPanel自己做家务画。
此外,如果要平滑圆的边框,请设置图形渲染提示以进行抗锯齿处理:
// do this:
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
// before calling this:
g.fillOval(x, y, diameter, diameter);
请注意,当我运行您的代码时,您的圈子似乎很适合自己。
答案 1 :(得分:0)
您想将面板设置在框架的中央吗?你可以用panel.setLocationRelativeTo(frame)做到这一点; (当然你应该在你的小组类中有一个框架的实例)