2015-05-26 2 views
0

*** EDIT - я удалил все ненужного кода (я думал, что это может быть полезным для кого-то, чтобы увидеть шаги, которые я предприняли для устранения)Мои метки в качестве объекта инстанс исчезают

Я имею очень странная проблема. Я создаю экземпляр объекта с несколькими объектами swing, но jlabel на всех, кроме самого последнего экземпляра, исчезает. Они все одинаковы, но только индекс наивысшего номера массива имеет свою метку. Но все они должны быть замечены. Я подтвердил, что они находятся в правильном положении и имеют правильный размер, и он установлен на видимый, но я не могу понять, почему это происходит. Я запустил программу на другом компьютере и получил те же результаты. Есть только два класса. Это довольно простая программа, но я не могу представить ее, может ли кто-нибудь запустить этот код и сообщить, работает ли он? если нет, кто-то может определить проблему?

import java.io.*; 
import java.lang.*; 
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.event.*; 

public class sizer extends JPanel { 
    public static int lhval = 10000; 
    public static int lvval = 10000; 
    public static int shval = 10000; 
    public static int svval = 10000; 
    public static String IDlbltxt = "0"; 
    public static int IDlblint = 0; 
    static boolean DEBUG = true; 

    public final static JLabel IDlbl = new JLabel("0"); 

    public sizer (int arg) { 
     setLayout(null); 
     setSize(91, 88); 
     setVisible(true); 

     IDlbltxt = Integer.toString(arg); 
     IDlblint = arg; 

     IDlbl.setHorizontalAlignment(SwingConstants.RIGHT); 
     IDlbl.setLocation(40 , 30); 
     IDlbl.setFont(new Font("Serif", Font.PLAIN, 18)); 
     IDlbl.setText(IDlbltxt); 
     IDlbl.setVisible(true); 
     IDlbl.setBorder(BorderFactory.createLineBorder(Color.black, 5)); 
     IDlbl.setSize(IDlbl.getPreferredSize()); 
     add(IDlbl); 


     repaint(); 
    } 

    public static void main(String[] args) { 
     final JFrame frame = new JFrame("sizer - gettin it sized"); 
     frame.setLayout(null); 
     frame.setSize(320, 260); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
     frame.getContentPane().setBackground(Color.red); 


     final sizer s1 = new sizer(0); 
     s1.setLocation(1, 1); 
     frame.add(s1); 

     frame.repaint(); 
    } 
} 

вот второй файл.

import java.io.*; 
import java.lang.*; 
import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.event.*; 

public class sizerist extends JPanel { 
    final static sizer[] sizing = new sizer[21]; 

    public sizerist() {} 

    public static void main(String[] args) { 
     final JFrame frame = new JFrame("sizer - gettin it sized"); 
     frame.setLayout(null); 
     frame.setSize(320, 260); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
     frame.getContentPane().setBackground(Color.red); 


     for (int i=1; i<6; i++) { 
      sizing[i] = new sizer(1); 
      if (i == 1) { 
       sizing[i].setLocation(1, 1); 
      } else { 
       sizing[i].setLocation(sizing[i-1].getLocation().x, sizing[i-1].getLocation().y + sizing[i-1].getSize().height + 2); 
      } 
      frame.add(sizing[i]); 
      frame.setSize(sizing[i].getSize().width + sizing[i].getLocation().x, sizing[i].getSize().height + sizing[i].getLocation().y + 40); 
     } 

     frame.repaint(); 
    } 
} 
+0

Это не делает код легче читать, что вы не используете Стандарты Java для именования (PascalCase для классов и camelCase для переменных). – chrylis

+0

Нулевые макеты не помогут вам. if (true) и if (false) не имеет смысла – MadProgrammer

+0

Call frame.setVisible (true) last, после того, как вы создали пользовательский интерфейс – MadProgrammer

ответ

1

Таким образом, ряд проблем ...

public static String IDlbltxt = "0"; 
public static int IDlblint = 0; 
static boolean DEBUG = true; 

public final static JLabel IDlbl = new JLabel("0"); 

static не является вашим другом. В основном, когда вы создаете первый экземпляр sizer, эти переменные static инициализируются, они никогда не инициализируются снова.

Компонент может находиться только в одном контейнере, а это означает, что каждый раз, когда вы звоните add(IDlbl); он сначала удаляется из его текущего контейнера, прежде чем был добавлен новый контейнер (или последний экземпляр sizer)

static является не механизм для кросс-объектных связей, привыкнуть к передаче ссылок и с помощью сеттеров и добытчиками

Ваш sizer класс имеет main метод, не проблема, просто точка путаницы ...

Позвоните по номеру frame.setVisible(true);, ПОСЛЕ того, как вы добавили все компоненты в окно.

Layout

Избегайте использование null макетов, пиксельные совершенные макеты являются иллюзией в современном дизайне пользовательского интерфейса. Слишком много факторов, которые влияют на индивидуальный размер компонентов, ни один из которых вы не можете контролировать. Swing был разработан для работы с менеджерами компоновки в ядре, отбрасывая их, что не приведет к проблемам и проблемам, которые вы потратите все больше времени на исправление.

Поскольку вы решили покончить с менеджерами макетов, у вас не будет никаких проблем с обновлением пользовательского интерфейса, так как любой из методов, которые обычно работают, вероятно, не будет работать или будет работать с перерывами.

Вы могли бы иметь чтения через Code Conventions for the Java TM Programming Language, он будет делать это проще для людей, чтобы читать ваш код и для вас, чтобы читать другие

+0

удаление статического исправлено проблема, как правило, компилятор лает на меня, требуя, чтобы я его вставлял. Утром я увижу другие компоненты, если он снова лает. Спасибо, что поработали со мной, чтобы разобраться в этом. – Goff

Смежные вопросы