Не могу добавить второй JLabel ко второму JPanel в одном JWindow
Я пытаюсь добавить 2 отдельных JLabels к 2 отдельным JPanels, все в одном JWindow! Первая метка отображается нормально в первой JPanel. Однако второй JLabel не показывает, хотя второй JPanel показывает! Поэтому мне просто нужно знать, как добавить компонент (в данном случае второй JLabel) ко второму JPanel. Любая помощь приветствуется...
package numchucks;
import java.awt.*;
import java.util.TimerTask;
import javax.swing.*;
import java.util.*;
import java.util.Timer;
import java.util.TimerTask;
/**
*
* @author aubrey
*/
public class Numchucks {
Toolkit toolkit = null;
Dimension dim = null;
Integer width = null;
Integer height = null;
static NumchuckPanel1 label;
static NumchuckPanel2 label2;
JWindow frame = new JWindow();
Container c = null;
JLabel title1 = new JLabel("Player 1.");
JLabel title2 = new JLabel("Player 2.");
static Timer timer;
public Numchucks(){
//get screensize
//double initialTheta = Math.toRadians(0); // start north
double initialTheta = Math.toRadians(90); // start west
// double initialTheta = Math.toRadians(180); // start south
double initialTheta2 = Math.toRadians(270); // start east
label = new NumchuckPanel1("Foo Bar", //
450, // circleCenterX
325, // circleCenterY
300, // radius
initialTheta, //
0.005); // thetaIncrement
label2 = new NumchuckPanel2("Foo Bar", //
450, // circleCenterX
325, // circleCenterY
300, // radius
initialTheta2, //
0.005); // thetaIncrement
label.setBorder(BorderFactory.createLineBorder (Color.black, 1));
label2.setBorder(BorderFactory.createLineBorder (Color.black, 1));
label.addMouseListener(label);
label2.addMouseListener(label2);
label.add(title1);
//Problem is Here, why isnt title2 visible on label2????
label2.add(title2);
//get screensize
toolkit = Toolkit.getDefaultToolkit ();
dim = toolkit.getScreenSize();
width = dim.width;
height = dim.height;
frame = new JWindow();
frame.setSize(dim);
//frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(label);
frame.add(label2);
frame.setVisible(true);
timer = new java.util.Timer();
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
label.rotate();
//System.out.println(label.theta);
label2.rotate();
//System.out.println(label2.theta);
}
});
}
}, 0, 1000l / 560l); // 60 frames per second
}
public static void main(String[] args) {
new Numchucks();
}
}
Я использую 2 практически идентичных JPanels под названием numchuckPanel1 и numchuckPanel2. Вот код:
package numchucks;
import java.awt.*;
import java.awt.event.*;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.*;
/**
*
* @author aubrey
*/
public class NumchuckPanel1 extends JPanel implements MouseListener{
int circleCenterX;
int circleCenterY;
int radius;
double theta;
private final double thetaIncrement;
static Timer timer;
static Toolkit toolkit = null;
static Dimension dim = null;
static Integer width = null;
static Integer height = null;
static NumchuckPanel1 label;
static Boolean isFin = false;
static int w = 100;
static int h = 100;
static Boolean isOpen = true;
//static JLabel title1;
//static JLabel title2;
static JWindow frame;
public NumchuckPanel1(String text, //
int circleCenterX, int circleCenterY, int radius, //
double initialTheta, double thetaIncrement) {
//super(text);
//this.setSize(150, 150);
this.setBackground(Color.WHITE);
this.setVisible(true);
this.circleCenterX = circleCenterX;
this.circleCenterY = circleCenterY;
this.radius = radius;
this.theta = initialTheta;
this.thetaIncrement = thetaIncrement;
rotate();
}
public void rotate() {
if (w!=500){
w++;
h++;
}
setBounds( //
this.circleCenterX - (int) (Math.sin(this.theta) * this.radius), //
this.circleCenterY - (int) (Math.cos(this.theta) * this.radius), //
w, h);
this.theta -= this.thetaIncrement;
if(this.theta<=-4.704203673205014){
System.out.println("Stopping Timer....");
Numchucks.timer.cancel();
isFin=true;
}
}
public void reverse() {
if (w!=100){
w--;
h--;
}
setBounds( //
this.circleCenterX - (int) (Math.sin(this.theta) * this.radius), //
this.circleCenterY - (int) (Math.cos(this.theta) * this.radius), //
w, h);
this.theta += this.thetaIncrement;
if(this.theta>=Math.toRadians(90)){
//this.theta=0.0d;
System.out.println("Stopping Timer....");
Numchucks.timer.cancel();
isFin=true;
}
}
public void mouseClicked(MouseEvent me) {
if(isOpen){
isOpen=false;
NumchuckPanel2.isOpen=false;
Numchucks.timer = new Timer();
Numchucks.timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
Numchucks.label.reverse();
Numchucks.label2.reverse();
System.out.println(theta);
//label2.rotate();
//System.out.println(label2.theta);
}
});
}
}, 0, 1000l / 560l); // 60 frames per second
return;
}
if(!isOpen){
isOpen=true;
NumchuckPanel2.isOpen=true;
Numchucks.timer = new Timer();
Numchucks.timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
Numchucks.label.rotate();
Numchucks.label2.rotate();
System.out.println(theta);
//label2.rotate();
//System.out.println(label2.theta);
}
});
}
}, 0, 1000l / 560l); // 60 frames per second
return;
}
}
public void mouseEntered (MouseEvent me) {}
public void mousePressed (MouseEvent me) {
}
public void mouseReleased (MouseEvent me) {
}
public void mouseExited(MouseEvent me){}
}
И код для второй NumchuckPanel здесь:
package numchucks;
import java.awt.*;
import java.awt.event.*;
import java.util.Timer;
import java.util.TimerTask;
import javax.swing.*;
/**
*
* @author aubrey
*/
public class NumchuckPanel2 extends JPanel implements MouseListener{
int circleCenterX;
int circleCenterY;
int radius;
double theta;
private final double thetaIncrement;
static Timer timer;
static Toolkit toolkit = null;
static Dimension dim = null;
static Integer width = null;
static Integer height = null;
static NumchuckPanel2 label2;
static Boolean isFin = false;
static int w = 100;
static int h = 100;
static Boolean isOpen = true;
//static JLabel title1;
//static JLabel title2;
static JWindow frame;
public NumchuckPanel2(String text, //
int circleCenterX, int circleCenterY, int radius, //
double initialTheta, double thetaIncrement) {
//super(text);
//this.setSize(150, 150);
this.setBackground(Color.WHITE);
this.setVisible(true);
this.circleCenterX = circleCenterX;
this.circleCenterY = circleCenterY;
this.radius = radius;
this.theta = initialTheta;
this.thetaIncrement = thetaIncrement;
rotate();
}
public void rotate() {
if (w!=500){
w++;
h++;
}
setBounds( //
this.circleCenterX - (int) (Math.sin(this.theta) * this.radius), //
this.circleCenterY - (int) (Math.cos(this.theta) * this.radius), //
w, h);
this.theta -= this.thetaIncrement;
//System.out.println(this.theta);
if(this.theta<=-1.5776110196152204){
System.out.println("Stopping Timer....");
//Numchucks.timer.cancel();
isFin=true;
}
}
public void reverse() {
if (w!=100){
w--;
h--;
}
setBounds( //
this.circleCenterX - (int) (Math.sin(this.theta) * this.radius), //
this.circleCenterY - (int) (Math.cos(this.theta) * this.radius), //
w, h);
this.theta += this.thetaIncrement;
/*
-4.664203673205015
-4.669203673205015
-4.674203673205015
-4.679203673205015
-4.6842036732050145
-4.689203673205014
-4.694203673205014
-4.704203673205014
*/
if(this.theta>=Math.toRadians(270)){
//this.theta=0.0d;
//System.out.println("Stopping Timer....");
Numchucks.timer.cancel();
isFin=true;
/*for (int i = 100; i<500; i++){
label.setSize(i,i);
}*/
//System.exit(0);
}
}
public void mouseClicked (MouseEvent me) {
if(isOpen){
isOpen=false;
NumchuckPanel1.isOpen=false;
Numchucks.timer = new Timer();
Numchucks.timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
Numchucks.label.reverse();
Numchucks.label2.reverse();
//System.out.println(label.theta);
//label2.rotate();
//System.out.println(label2.theta);
}
});
}
}, 0, 1000l / 560l); // 60 frames per second
return;
}
if(!isOpen){
isOpen=true;
NumchuckPanel1.isOpen=true;
Numchucks.timer = new Timer();
Numchucks.timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
Numchucks.label.rotate();
Numchucks.label2.rotate();
//System.out.println(label.theta);
//label2.rotate();
//System.out.println(label2.theta);
}
});
}
}, 0, 1000l / 560l); // 60 frames per second
return;
}
}
public void mouseEntered (MouseEvent me) {}
public void mousePressed (MouseEvent me) {
}
public void mouseReleased (MouseEvent me) {
}
public void mouseExited(MouseEvent me){}
}
1 ответ
Решение
ОК, удалось решить проблему.
Второй Jpanel выравнивал JLabel вправо. Использование выравнивания по левому краю на моих панелях решило это:
JPanel panel = new JPanel(new FlowLayout(FlowLayout.LEFT));