2017-01-16 3 views
0

Я хочу использовать два JPanels в одном JFrame, с невидимой горизонтальной линией между ними. Я играл немного и получил это:Два JPanels в одном JFrame

public class Application { 

    public static void main(String[] args) 
    { 

     JFrame jframe = new JFrame(); 
     jframe.setSize(500,700); 
     jframe.setVisible(true); 
     jframe.setTitle("Title"); 
     jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     jframe.setResizable(false); 


     JSplitPane splitPane = new JSplitPane(); 
     JPanel leftPanel = new JPanel(); 
     JPanel rightPanel = new JPanel(); 
     splitPane.setOrientation(JSplitPane.HORIZONTAL_SPLIT); 
     splitPane.setDividerLocation(250);      
     splitPane.setLeftComponent(leftPanel);     
     splitPane.setRightComponent(rightPanel); 
     jframe.add(splitPane); 


    } 
} 

Теперь первая проблема заключается в том, как я могу отключить «Изменяемость размеров» линии между панелями? И как сделать его «невидимым»? Может быть, использовать что-то еще, чем разделение панели?

Прежде всего, как я могу работать только с одной стороной JPanel? (Я работаю над приложением, которое позволяет рисовать круг с левой стороны).

Это похоже на простой вопрос, но я относительно новичок в Java.

+1

Использовать 'GridBagLayout' или' BorderLayout' вместо – MadProgrammer

ответ

3

Как было сказано ранее в comment по @MadProgrammer вы можете использовать BorderLayout или GridBagLayout, но, как вы размещения «раздвоение» линии прямо в середине обеих панелей вы можете использовать GridLayout которые сделают обе панели быть одинаковой размер независимо от размера окна.

Я не пробовал с GridBagLayout, но я сделал пример того, как вы могли бы достичь этого разделения панелей без использования JSplitPane.

С GridLayout все, что вам нужно сделать, это добавить элементы в левой панели (в моем примере я использовал JLabel дифференцировать их) в то время как в BorderLayout вам нужно указать, что панель, где вы будете красить круг в быть выровненным слева (WEST константа), как и я.

Однако, если вы используете подход BorderLayout и добавляете текст или элементы в правую панель, они будут выровнены вправо, вы можете исправить это путем «бокса» элементов в другой панели с помощью другого Layout.

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.GridLayout; 

import javax.swing.BorderFactory; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class Application { 

    private JFrame frame; 
    private JPanel containerPane; 
    private JPanel topPane; 
    private JPanel bottomPane; 

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

    public void createAndShowGui() { 
     frame = new JFrame("Example of 2 panels"); 
     containerPane = new JPanel(); 
     topPane = new JPanel(); 
     bottomPane = new JPanel(); 

     containerPane.setLayout(new GridLayout(2, 1)); 
     topPane.setLayout(new GridLayout(1, 2)); 
     bottomPane.setLayout(new BorderLayout()); 

     topPane.add(new JLabel("Left side")); 
     topPane.add(new JLabel("Right side")); 

     bottomPane.add(new JLabel("Left side"), BorderLayout.WEST); 
     bottomPane.add(new JLabel("Right side"), BorderLayout.EAST); 

     topPane.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.BLUE), "Using GridLayout")); 
     bottomPane.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.BLUE), "Using BorderLayout")); 

     containerPane.add(topPane); 
     containerPane.add(bottomPane); 

     frame.add(containerPane); 

//  frame.pack(); 
     frame.setSize(500, 400); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 
} 

Я не называю pack() в этом примере, так как размер обеих панелей (или JLabel с в этом случае не было достаточно высоким, чтобы показать разницу:

Использование pack():

enter image description here

Вызов setSize():

enter image description here


Дополнительные советы

  1. Не забудьте поставить свою программу на Event Dispatch Thread (EDT), я сделал это, написав эти строки на main метода:

    SwingUtilities.invokeLater(new Runnable() { 
        @Override 
        public void run() { 
         new Application().createAndShowGui(); 
        } 
    }); 
    
  2. Дону Поместите весь свой код на конструктор, иначе его будет сложно поддерживать

+2

Мои деньги на этот ответ –

+0

Вау, спасибо огромное. Но теперь мои приложения кажутся довольно глючными. Любой круг не отображается вообще или в разных местах (и на всем кадре). Я редактировал свой пост с новыми классами. – MassU

+0

@MassU Этот вопрос был связан с тем, как разместить два JPanels на одном JFrame, на который был дан ответ в этом ответе, пожалуйста, задайте другой вопрос с новым кодом и проблемами, которые у вас есть. Также не забудьте принять ответ – Frakcool

1

Похоже, вы можете использовать GridLayout для этого. Вот что я думаю,

public class Application { 
    public static void main(String[] args) { 

     JFrame jframe = new JFrame(); 
     jframe.setTitle("Title"); 
     jframe.setResizable(false); 

     //This creates one row and two equally divided columns 
     GridLayout gridLayout = new GridLayout(0, 2); 
     jframe.setLayout(gridLayout); 
     gridLayout.layoutContainer(jframe); 

     JPanel leftPanel = new JPanel(); 
     leftPanel.add(new Label("Left side")); 
     jframe.add(leftPanel); 

     JPanel rightPanel = new JPanel(); 
     rightPanel.add(new Label("Right side")); 
     jframe.add(rightPanel); 

     jframe.setSize(800, 500); 
     jframe.setVisible(true); 
     jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    } 
} 

Вот как это выглядит: enter image description here

Панели не будет изменять размеры, а также там нет строки видно, что seprates их.

+0

Спасибо, это то, что я искал. Но, похоже, эта задача не так проста, как я думал. Как я могу работать с левой стороной сейчас? У меня есть класс DrawCircle, в котором можно рисовать круг с помощью мыши. leftPanel.add (c) не работает. – MassU

+2

@MassU: понимайте, что этот ответ содержит код, который не соответствует лучшим методам Swing, включая вызов 'setSize (...)' на компоненте, а также вызов 'setVisible (true)' на JFrame * перед * добавлением всех компонентов к графическому интерфейсу, что может препятствовать показ некоторых компонентов. Пожалуйста, решите, пожалуйста, ответ Frakcool. –

+0

Определенно, соглашайтесь с @Hovercraft Full Eels. Мой код не соответствует лучшему формату. Я не редактировал код MassU. –