JPanel на JPanel в JFrame не будет отображаться - PullRequest
4 голосов
/ 13 декабря 2010

Здравствуйте, я любитель, пытающийся выучить / улучшить свое понимание Java, написав оценочную карту для стрельбы из лука.Я пытаюсь создать графический интерфейс и до сих пор успешно выполнил на JPanel ряд из 18 этикеток разных размеров и цветов, подходящих для оценки дюжины.
Затем я попытался добавить пять из этих «панелей этикеток» в другую.панель для создания сетки и избавления от необходимости создавать и добавлять до 150 ярлыков в некоторых случаях.Безуспешно, поскольку панели оригинальных этикеток не будут отображаться.Все панели отображаются на JFrame

. Я пробовал несколько разных способов заставить код работать, используя учебник по Java и поиск в Интернете и изучая подобные проблемы на этом сайте, но я собираюськруг в кругах.Должно быть, я что-то упустил где-то и надеюсь, что вы сможете помочь.

Я использую Java 6 и JGrasp v1.8.8_01 в качестве IDE

Следующий код для панели метокбыло сокращено, поскольку большая часть повторяется.

import javax.swing.*;  
import java.awt.*;  
public class ArrowScoreLabels extends JPanel{
  public  JPanel createContentPane(){
    JPanel panelForLabels = new JPanel();
    panelForLabels.setLayout(null);
//Code creates 18 labels, sets the size, position, background colours, border and    
//font and adds the labels to the’panelForLabels
    JLabel scorelabel1;
     scorelabel1 = new JLabel("",JLabel.CENTER);
     scorelabel1.setBorder(BorderFactory.createLineBorder(Color.black)); 
     scorelabel1.setFont(new Font("Arial", Font.ITALIC, 26));  
     scorelabel1.setLocation(0, 0);//first value differs for each label
     scorelabel1.setSize(35, 35);
     scorelabel1.setOpaque(true);

        panelForLabels.add(scorelabel1);
        panelForLabels.setOpaque(true);
    return panelForLabels;
  }
}  

При запуске следующего класса на панели отображаются 18 меток

import javax.swing.*;
import java.awt.*; 
public class TestArrowScoreLabels {

  private static void createAndShowArrowLabels() {
 //Create and set up the window.
  JFrame frame = new JFrame("To score one dozen");
 //Create and set up the content pane.
  ArrowScoreLabels asl = new ArrowScoreLabels();
  frame.setContentPane(asl.createContentPane()); 
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
  frame.setSize(676, 73);
  frame.setVisible(true);
  }
//Main method to show the GUI/
  public static void main(String[] args) {
    SwingUtilities.invokeLater(
     new Runnable() {
      public void run() {
      createAndShowArrowLabels();
      }
    });
  }
}

Следующий код для второй панели аналогичен, компилируетсяно показывает только второй зеленый JPanel, а не панель с метками.

import javax.swing.*;
import java.awt.*;


public class FiveDozenScorePanel{
 public JPanel createContentPane(){
  //A bottom JPanel on which to place five dozenpanels.
  JPanel fivedozenpanel = new JPanel();
  fivedozenpanel.setLayout(null); //requires absolute spacing
  fivedozenpanel.setSize(676,185);  
  fivedozenpanel.setBackground(Color.green);
  //Label panels for five dozen
  ArrowScoreLabels dozenscorepanel1, dozenscorepanel2,
         dozenscorepanel3,dozenscorepanel4,dozenscorepanel5;   
  //Create the 5 dozenscorelabels.
  dozenscorepanel1 = new ArrowScoreLabels();         
  dozenscorepanel1.setLocation(5,5);//y value changes for each panel

  fivedozenpanel.add(dozenscorepanel1);//plus the other 4
  fivedozenpanel.setOpaque(true);
  return fivedozenpanel;
}

private static void createAndShowDozenPanels() {
 JFrame frame = new JFrame("To score five dozen");
  FiveDozenScorePanel fdsp = new FiveDozenScorePanel();
  frame.setContentPane(fdsp.createContentPane());   
  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
  //Display the window  
  frame.setSize(700, 233);
  frame.setVisible(true);
 }   

public static void main(String[] args) {
 SwingUtilities.invokeLater(
  new Runnable() {
   public void run() {                     
     createAndShowDozenPanels();
   }
  });               
 }
}

Я также пробовал frame.getContentPane (). add (fdsp);- frame.pack ();и так много читал о методах рисования, что я совершенно запутался.Я могу заставить изображение ArrowScoreLabels отображаться непосредственно на JFrame, а не на JPanel, а только на одном из них, а не на пяти.

Я был бы признателен за указание в правильном направлении.Спасибо за потраченное время.

Обновление - 14 декабря 2010 г. Мне удалось отобразить панель ForLabels Jpanel на другой Jpanel на JFrame.Это было сделано путем добавления следующего кода в класс ArrowScoreLabels.Исходный метод createContentPane () был переименован в createRowOne ().Панель ForLabels была красного цвета, а пятидюймовая панель желтого цвета, чтобы выяснить, какая из них была.Однако мне удалось только убедить программу отобразить одну строку меток, несмотря на большие эксперименты и исследования.

public  static JPanel createContentPane(){
   //Bottom panelto hold rows of labels
     JPanel fivedozenscorepanel = new JPanel();      
     fivedozenscorepanel.setLayout(null);//requires absolute spacing
     fivedozenscorepanel.setSize(660,180);
     fivedozenscorepanel.setBackground(Color.yellow);
     fivedozenscorepanel.add(createRowOne());

     fivedozenscorepanel.setOpaque(true);
     return fivedozenscorepanel;
  }

Единственный способ отобразить 5 строк по 18 меток - это создать все 90 строк.класс ArrowScoreLabels, а затем добавьте их в один JPanel, используя абсолютный интервал, а затем в JFrame.Я принял к сведению совет pstantons - спасибо за это - и я изучаю использование MigLayout Manager.

Ответы [ 2 ]

4 голосов
/ 13 декабря 2010

простой ответ: используйте менеджер раскладки .не используйте абсолютное позиционирование.

просто закомментируйте все ваши звонки на setLocation и setLayout, и Swing будет использовать значение по умолчанию FlowLayout.

для большего контроля над дисплеемиспользуйте другой менеджер компоновки.

также, если вы используете несколько панелей, у вас будут проблемы с выравниванием объектов на разных панелях, если они не содержат одинаковое количество компонентов одинакового размера, поэтому рассмотрите возможность использования одной панели для всех

вы можете достичь практически любой раскладки, используя MigLayout.

РЕДАКТИРОВАТЬ: в вашем примере нет необходимости в ArrowScoreLabelsрасширить JPanel, так как вы выполняете работу в createContentPane для создания отдельной JPanel.позже в вашем коде вы вызываете new ArrowScoreLabels(), который просто возвращает пустой JPanel, вместо этого вам нужно вызвать new ArrowScoreLabels().createContentPane()

, если вы хотите, чтобы ArrowScoreLabels расширил JPanel, реализуйте public ArrowScoreLabels(), то есть конструктор вместоcreateContentPane.

0 голосов
/ 13 декабря 2010

У меня сложилось впечатление, что вы не устанавливаете размер для своей десятки панелей1. Итак, установите размер: -)

Будьте осторожны с нулевым макетом, потому что это боль; ты всегда что-то забываешь Напишите свой или используйте существующий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...