Перекрасить в накладные панели
У меня есть JFrame, одна главная JPanel, и только в левой половине JFrame, вторая JPanel. Когда я нажимаю кнопку JButton в основной JPanel, вторая JPanel становится видимой.
Я собираюсь создать paintComponent в основном классе JPanel, нарисовать изображение, один круг и все работы.
Проблема возникает, когда я иду, чтобы изменить цвет этого круга. Я меняю RGB каждый раз, когда я перекрашиваюсь (); Цвет круга изменится, но если я нажму на кнопку JButton в основной JPanel, чтобы открыть вторую JPanel, я немного ее увижу, и она станет невидимой.
Я полагаю, потому что он перерисовывает основной JPanel выше второго..
Как я могу решить эту проблему? Спасибо вам!.
PS я использую super.paintComponent(g); и в конструкторе JPanel я делаю this.repaint(), чтобы немедленно вызвать компоненты первой страницы, в противном случае я должен свернуть окно и снова появиться.
//Panel extends JPanel
//at the end of Constructor
this.repaint();
}
@Override
protected void paintComponent(Graphics g){
super.paintComponent(g);
setOpaque(true);
g.drawImage(img, 210, 50, 580,580,this);
g.setColor(Color.black);
g.drawOval(480,40,40,40);
g.fillOval(480,40,40,40); //Various..
repaint(); //With this i can't saw the second JPanel that it's overlapped
} //whit the main JPanel
Алессандро Амедей, Флоренция.
27-01-2015 Это мой код..
ОСНОВНАЯ ПАНЕЛЬ
package a;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import javax.swing.JPanel;
// @author Alessandro Amedei
public class FirstPanel extends JPanel{
Image img = null;
FirstPanel(){
LotL LotL = new LotL();
FPListener FPL = new FPListener();
this.setVisible(true);
this.setSize(1000,1000);
this.setLayout(null);
this.setBackground(Color.white);
this.addMouseListener(FPL);
Main.f1.add(this);
Button start = new Button("Start Game!");
Button options = new Button("Options");
start.setVisible(true);
start.setSize(200,80);
start.setLayout(null);
start.setLocation(400,650);
start.addActionListener(LotL);
start.setBackground(Color.green);
start.identificatore=1;
this.add(start);
options.setVisible(true);
options.setSize(200,70);
options.setLayout(null);
options.setLocation(400,750);
options.addActionListener(LotL);
options.setBackground(Color.green);
options.identificatore=2;
this.add(options);
img= Toolkit.getDefaultToolkit().getImage("ok.jpg");
this.repaint();
}
int B=30;
int R=80;
int G=90;
@Override
protected void paintComponent(Graphics g){
super.paintComponent(g);
setOpaque(true);
g.drawImage(img, 210, 65, 580,580,this);
g.setColor(new Color(R,G,B));
g.drawOval(455,20,90,90);
g.fillOval(455,20,90,90);
if(B==150)
B=0;
if(R==170)
R=0;
if(G==160)
G=0;
try {
Thread.sleep(5);
} catch (InterruptedException ex) {
}
B++;
R++;
G++;
repaint();
}
}
ВТОРАЯ ПАНЕЛЬ
package a;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.JSpinner;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.SpinnerNumberModel;
//@author Alessandro Amedei
public class OptionsPanel extends JPanel {
static JSlider rgb1 = new JSlider(0,255);
static JSlider rgb2 = new JSlider(0,255);
static JSlider rgb3 = new JSlider(0,255);
static SpinnerNumberModel noba = new SpinnerNumberModel();
static JTextField fg1 = new JTextField();
static JTextField fg2 = new JTextField();
OptionsPanel(){
this.setVisible(false);
this.setSize(350,1000);
this.setLayout(null);
this.setBackground(new Color(255,150,0));
Main.f1.add(this);
JSpinner nob = new JSpinner(noba);
JLabel l1= new JLabel("Options");
JLabel l2= new JLabel("Background Color");
JLabel g1= new JLabel("Left Button Color");
JLabel g2= new JLabel("Right Button Color");
JLabel nob1 = new JLabel("Number of Checkers for Player");
JLabel ng1= new JLabel("Name of Left Player");
JLabel ng2= new JLabel("Name of Right Player");
rgb1.setVisible(true);
rgb1.setSize(240,40);
rgb1.setLocation(55,90);
this.add(rgb1);
rgb1.setBackground(new Color(rgb1.getValue(),255,0));
rgb1.addChangeListener(new SListener());
rgb2.setVisible(true);
rgb2.setSize(240,40);
rgb2.setLocation(55,180);
this.add(rgb2);
rgb2.setBackground(new Color(255,0,rgb1.getValue()));
rgb2.addChangeListener(new SListener());
rgb3.setVisible(true);
rgb3.setSize(240,40);
rgb3.setLocation(55,270);
this.add(rgb3);
rgb3.setBackground(new Color(0,rgb1.getValue(),255));
rgb3.addChangeListener(new SListener());
nob.setVisible(true);
nob.setSize(60,30);
nob.setLocation(55,360);
noba.setMaximum(10);
noba.setMinimum(3);
noba.setValue(3);
this.add(nob);
fg1.setVisible(true);
fg1.setSize(150,30);
fg1.setLocation(55,450);
this.add(fg1);
fg2.setVisible(true);
fg2.setSize(150,30);
fg2.setLocation(55,540);
this.add(fg2);
Font f= new Font("arial",Font.ITALIC,20);
Font f2= new Font("arial",Font.BOLD,13);
l1.setVisible(true); //Etichetta OPTIONS
l1.setSize(70,20);
l1.setLocation(140,10);
l1.setFont(f);
this.add(l1);
l2.setVisible(true);
l2.setSize(120,30);
l2.setLocation(55,65);
l2.setFont(f2);
this.add(l2);
g1.setVisible(true);
g1.setSize(150,30);
g1.setLocation(55,155);
g1.setFont(f2);
this.add(g1);
g2.setVisible(true);
g2.setSize(150,30);
g2.setLocation(55,245);
g2.setFont(f2);
this.add(g2);
nob1.setVisible(true);
nob1.setSize(200,30);
nob1.setLocation(55,335);
nob1.setFont(f2);
this.add(nob1);
ng1.setVisible(true);
ng1.setSize(200,30);
ng1.setLocation(55,425);
ng1.setFont(f2);
this.add(ng1);
ng2.setVisible(true);
ng2.setSize(200,30);
ng2.setLocation(55,515);
ng2.setFont(f2);
this.add(ng2);
}
public void paintComponent(Graphics g){
super.paintComponent(g);
}
Итак, если я изменю цвет круга в основной JPanel, используя repaint(); Я не могу показать панель параметров, я думаю, из-за обновления, вызванного методом repaint () Main JPanel. Как я могу изменить цвет круга в главной JPanel и одновременно визуализировать панель параметров? (исключая создание другой панели, где я рисую круг). Извините за мой плохой английский! Большое вам спасибо. Алессандро Амедей, Флоренция.