2015-04-08 2 views
1

Итак, я рассматривал другие решения этой проблемы, но, похоже, ни одна из них не помогает вообще. Кто-нибудь может мне помочь?java - Настройка кнопок и текста в местах

Код:

public static void main(String[] args) { 

    JFrame frame = new JFrame(); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    // Container cont = frame.getContentPane(); 
    JPanel buttonpanel = new JPanel(); 
    JButton[] button = new JButton[12]; 
    JTextArea score1, score2; 
    score1 = new JTextArea(100, 200); 
    score2 = new JTextArea(100, 200); 

    frame.setSize(800, 600); 
    frame.setVisible(true); 
    score1.setLayout(null); 
    score1.setBackground(Color.BLUE); 
    score2.setLayout(null); 
    score2.setBackground(Color.RED); 

    score1.setLocation(0, 100); 
    score2.setLocation(700, 100); 

    frame.add(score1); 

    for (int i = 0; i < button.length/2; i++) { 
     button[i].setBounds(100 * (i + 1), 100, 100, 100); 
     button[i].setBackground(Color.GRAY); 
     buttonpanel.add(button[i]); 
    } 

    frame.add(buttonpanel); 

    frame.add(score2); 

    // frame.add(panel); 
} 

Это просто дает мне окно полностью синий.

+1

Кроме того, если вы пытаетесь настроить графический интерфейс, покажите изображение, которое показывает, чего вы пытаетесь достичь. В 99% случаев лучшее решение - это не то, как вы это делаете. Не используйте абсолютное позиционирование, потому что это ужасный способ сделать GUI 99% времени. –

+0

Хотя пустые макеты и 'setBounds()' могут показаться Swing новичками, как самый простой и лучший способ создания сложных графических интерфейсов, чем больше Swing GUI вы создадите более серьезные трудности, с которыми вы столкнетесь при их использовании. Они не будут изменять размеры ваших компонентов при изменении размера графического интерфейса, они являются королевской ведьмой для улучшения или поддержки, они полностью не выполняются при размещении в scrollpanes, они выглядят ужасно ужасно при просмотре на всех платформах или разрешениях экрана, отличных от исходного , –

ответ

3

Вы видите все синие цвета, потому что вы добавляете score1, все синие JTextArea в контентную панель JFrame, контейнер, который использует BorderLayout, и это заставляет JTextArea заполнять contentPane, не оставляя ничего, кроме синего. Ничего еще не добавлено, поскольку исключение NullPointerException, вызванное использованием массива JButton, заполненным нулями. Как только вы исправите эту ошибку (о которой вы никогда не говорили), вы не увидите ничего, кроме красного, из-за той же проблемы.

Лучшее решение, о котором вы, несомненно, читали, - это использование менеджеров компоновки с максимальным преимуществом для создания вашего графического интерфейса. Хотя макеты null и setBounds() могут показаться Swing новичками, как самый простой и лучший способ создания сложных графических интерфейсов, чем больше Swing GUI вы создадите более серьезные трудности, с которыми вы столкнетесь при их использовании. Они не будут изменять размеры ваших компонентов при изменении размера графического интерфейса, они являются королевской ведьмой для улучшения или поддержки, они полностью не выполняются при размещении в scrollpanes, они выглядят ужасно ужасно при просмотре на всех платформах или разрешениях экрана, отличных от исходного ,

Другие проблемы:

  • Вы звоните setVisible(true) на вашем JFrame перед тем добавляя что-нибудь к нему, которое в обратном направлении. Вы хотите сделать этот звонок после, все было добавлено, чтобы оно отображалось в JFrame, когда оно отображается.
  • Вы устанавливаете компоновку JTextArea, которая не имеет смысла, поскольку вы никогда не захотите использовать их в качестве контейнеров для других компонентов.
  • Также поймите, что это не делает то, что вы думаете, что это делает: JTextArea(100, 200);. Вы не создаете JTextArea, размер которой составляет 100 на 200 пикселей, а составляет 100 строк по 200 столбцов, который является удивительным огромным JTextArea. Вы захотите прочитать документацию, API при использовании незнакомых компонентов.
  • Вы заявляете, "So I've been looking at other solutions to this problem, but it seems that none of them help at all." Возможно, «другие решения» рекомендовали использовать диспетчеров макетов, а не заявлять, что они вообще не помогают, вам следует попытаться научиться использовать эти инструменты, поскольку эти другие решения - правильно.
  • И да, вы пытаетесь использовать JButtons в массиве JButton, которые еще не созданы. Поймите, что массив ссылочного типа, такой как массив JButton, изначально заполнен только нулевыми ссылками, похожими на пустую коробку с яйцами. Так же, как вы не можете использовать какие-либо яйца из коробки, пока вы не поместите туда яйца, вы не сможете использовать JButtons в своем массиве, прежде чем вы разместите их там.В течение цикла, где вы итерации через массив, создать каждый элемент JButton в верхней строке: button[i] = new JButton("Something");

Вы можете найти ссылки на Swing, учебные пособия и другие Свинги ресурсов здесь: Swing Info

Например, вы скажите мне, что проще отлаживать, ваш код, или этот код:

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

public class Foo2 extends JPanel { 
    private static final String[] BUTTON_TEXTS = { "A", "B", "C", "D", "E", "F", 
     "G", "H", "I", "J", "K", "l" }; 
    private static final int GAP = 3; 
    private JTextArea textArea1 = new JTextArea(20, 30); 
    private JTextArea textArea2 = new JTextArea(20, 30); 

    public Foo2() { 
     JPanel textAreaGrid = new JPanel(new GridLayout(1, 0, GAP, GAP)); // gridlayout 1 row 
     textAreaGrid.add(new JScrollPane(textArea1)); 
     textAreaGrid.add(new JScrollPane(textArea2)); 

     JPanel buttonPanel = new JPanel(new GridLayout(2, 0, GAP, GAP)); // 2 rows 
     for (String btnText : BUTTON_TEXTS) { 
     buttonPanel.add(new JButton(btnText)); 
     } 

     setBorder(BorderFactory.createEmptyBorder(GAP, GAP, GAP, GAP)); 
     setLayout(new BorderLayout(GAP, GAP)); // main GUI uses border layout 
     add(textAreaGrid, BorderLayout.CENTER); 
     add(buttonPanel, BorderLayout.PAGE_END); 
    } 

    private static void createAndShowGui() { 
     Foo2 mainPanel = new Foo2(); 

     JFrame frame = new JFrame("Foo2"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

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

который показывает, как:

enter image description here

+0

Извините, я до сих пор не очень хорошо разбираюсь в Java. Это похоже на мой второй раз и мой первый в течение 3 лет. Поэтому я могу понять свои ошибки и перешел, чтобы исправить много вещей (спасибо за это). Поэтому я нахожусь в той части, где хочу сделать окно похожим на игру «Манкала». Вместо использования ям, это кнопки. Я получил боковые ямы или цели, чтобы показать, но кнопка не отображается между текстовыми полями. Подсказки, пожалуйста? – Xephos

+0

Nvmd, мне не удалось использовать SetLayout (null), поскольку это каким-то образом мешало мне организовывать? В любом случае, теперь, как поместить кнопки и область текста под другое текстовое поле? – Xephos

+0

Я исправил это! Спасибо за вашу помощь! – Xephos