В моем назначении Graphics я не могу установить фоновый цвет панели. Если я поместил 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);
}
}
}
Не забудьте вызвать 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);
Обратите внимание, что ваш круг, кажется, очень хорошо центрируется, когда я запускаю ваш код.
Вы хотите установить панель в центре кадра? Вы можете сделать это с помощью panel.setLocationRelativeTo(frame); (конечно, у вас должен быть экземпляр фрейма на вашем классе панели)