2013-12-07 5 views
9

Я использую JSplitPane включает в себя два JScrollPane с каждой стороны. Я не знаю, как сделать их при равных размерах при запуске. Вот мой основной код:Java Swing: JSplitPane разделить два компонента равный размер при запуске

contentPane = new JPanel(); 
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
    contentPane.setLayout(new BorderLayout(0, 0)); 
    setExtendedState(java.awt.Frame.MAXIMIZED_BOTH); 
      inputTextArea = new JTextArea(); 
    outputTextArea = new JTextArea(); 

    // put two TextArea to JScrollPane so text can be scrolled when too long 
    JScrollPane scrollPanelLeft = new JScrollPane(inputTextArea); 
    JScrollPane scrollPanelRight = new JScrollPane(outputTextArea); 

    // put two JScrollPane into SplitPane 
    JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, 
      scrollPanelLeft, scrollPanelRight); 
    splitPane.setOneTouchExpandable(true); 
    splitPane.setDividerLocation(650); // still no effect 
    contentPane.add(splitPane, BorderLayout.CENTER); 

Я использовал splitPane.setDividerLocation(getWidth()/2);, но до сих пор никакого эффекта.

Пожалуйста, скажите мне, как это исправить.

Для получения более подробной информации. Вот мой полный код:

package com.view; 

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.FlowLayout; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.ButtonGroup; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JRadioButton; 
import javax.swing.JScrollPane; 
import javax.swing.JSplitPane; 
import javax.swing.JTextArea; 
import javax.swing.border.EmptyBorder; 

//import com.controller.Controller; 

public class Main extends JFrame { 

    private static final long serialVersionUID = 1L; 

    private JPanel contentPane; 
    public JTextArea inputTextArea; 
    public JTextArea outputTextArea; 
    private JButton inputBtn; 
    private JButton outputBtn; 
    private JButton sortBtn; 
    public JRadioButton firstButton; 
    public JRadioButton secondButton; 
    public JRadioButton thirdButton; 
    JSplitPane splitPane; 

    //Controller controller; 

    /** 
    * Launch the application. 
    */ 
    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        Main frame = new Main(); 
       } 
       catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    /** 
    * Create the frame. 
    */ 
    public Main() { 
    // controller = new Controller(this); 

     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setBounds(100, 100, 450, 300); 
     contentPane = new JPanel(); 
     contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
     contentPane.setLayout(new BorderLayout(0, 0)); 

     /** 
     * center 
     * include two TextArea for display text 
     */ 

     inputTextArea = new JTextArea(); 
     outputTextArea = new JTextArea(); 

     // put two TextArea to JScrollPane so text can be scrolled when too long 
     JScrollPane scrollPanelLeft = new JScrollPane(inputTextArea); 
     JScrollPane scrollPanelRight = new JScrollPane(outputTextArea); 

     // put two JScrollPane into SplitPane 
     JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, 
       scrollPanelLeft, scrollPanelRight); 
     splitPane.setOneTouchExpandable(true); 
     contentPane.add(splitPane, BorderLayout.CENTER); 

     /** 
     * Top 
     * Include two button : SelectFile and WriteToFile 
     * this layout includes some tricky thing to done work 
     */ 

     // create new input button 
     inputBtn = new JButton("Select File"); 
     // declare action. when user click. will call Controller.readFile() method 
     // (see this method for detail) 
     inputBtn.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent arg0) { 
      // controller.readFile(); 
      } 
     }); 

     // create new output button 
     outputBtn = new JButton("Write To File"); 
     // declare action. when user click. will call Controller.writeFile() method 
     // (see this method for detail) 
     outputBtn.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
      // controller.writeFile(); 
      } 
     }); 

     // put each button into seperate panel 
     JPanel tmpPanel1 = new JPanel(); 
     tmpPanel1.add(inputBtn); 
     JPanel tmpPanel2 = new JPanel(); 
     tmpPanel2.add(outputBtn); 

     // finnally. put those two pane into TopPane 
     // TopPane is GridLayout 
     // by using this. we can sure that both two button always at center of screen like Demo 
     JPanel topPanel = new JPanel(); 
     topPanel.setLayout(new GridLayout(1, 2)); 
     topPanel.add(tmpPanel1); 
     topPanel.add(tmpPanel2); 
     contentPane.add(topPanel, BorderLayout.NORTH); 

     /** 
     * Bottom panel 
     * Include all radionbutton and sortbutton 
     */ 

     // Group the radio buttons. 
     firstButton = new JRadioButton("Last Name"); 
     secondButton = new JRadioButton("Yards"); 
     thirdButton = new JRadioButton("Rating"); 
     // add those button into a group 
     // so . ONLY ONE button at one time can be clicked 
     ButtonGroup group = new ButtonGroup(); 
     group.add(firstButton); 
     group.add(secondButton); 
     group.add(thirdButton); 

     // create sor button 
     sortBtn = new JButton("Sort QB Stats"); 
     // add action for this button : will Call Controller.SortFile() 
     sortBtn.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent e) { 
      // controller.sortFile(); 
      } 
     }); 

     // add all to bottomPanel 
     JPanel bottomPanel = new JPanel(new FlowLayout()); 
     bottomPanel.add(firstButton); 
     bottomPanel.add(secondButton); 
     bottomPanel.add(thirdButton); 
     bottomPanel.add(sortBtn); 
     contentPane.add(bottomPanel, BorderLayout.SOUTH); 

     setContentPane(contentPane); 
     setTitle("2013 College Quarterback Statistics"); 
     setExtendedState(java.awt.Frame.MAXIMIZED_BOTH); 
     setVisible(true); 
     System.out.println("getwidth: " + getWidth()); 
     splitPane.setDividerLocation(getWidth()/2); 
    } 

} 

Спасибо :)

+0

Если вы не знаете размер, который родительский контейнер будет перед рукой, нет реального способа узнать, но, основываясь на вашем примере, попробуйте установить местоположение разделителя ПОСЛЕ того, как вы добавили его в контейнер ... – MadProgrammer

+0

Попробуйте установить линии и ширину вашего JTextArea и посмотреть, работает ли это. 'JTextArea inputTextArea = new JTextArea (10, 30)' или что-то подобное для обоих. –

+0

@peeskillet Я попробовал. но до сих пор не изменилось – hqt

ответ

8

Я понял это правильно. Я добавляю это;

contentPane.add(splitPane, BorderLayout.CENTER); 
splitPane.setResizeWeight(0.5); <------- here :) 

И я избавилась от setDviderLocation() в нижней

Inititally устанавливает свойство изменения размера Wieght. значения от 0.0 до 1.0, процент двойного значения для разделения панели. Есть много, чтобы преуспеть в отношении предпочтительных размеров и таких, о которых я читал в JSplitPane tutorial, так что вы можете проверить это сами.

+0

Не может быть лучше.Я многое узнал из этого. спасибо: D – hqt

+1

+1, @hqt, но вы должны знать, что это также влияет на изменение размера после того, как рамка также видна. – camickr

1

Первоначально getWidth() размер 0. Добавить splitPane.setDividerLocation(getWidth()/2); после setvisible(true). Попробуйте,

// put two JScrollPane into SplitPane 
    JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, 
      scrollPanelLeft, scrollPanelRight); 
    splitPane.setOneTouchExpandable(true); 
    // still no effect 
    add(splitPane, BorderLayout.CENTER); 
    setExtendedState(java.awt.Frame.MAXIMIZED_BOTH); 

    setVisible(true);// JFrame setVisible 
    splitPane.setDividerLocation(getWidth()/2); //Use setDividerLocation here. 
+0

Как при отладке. после setVisible(). getWidth() отображается в реальном размере. Но это все равно не влияет на то, что оба JScrollbar отображаются одинакового размера. – hqt

+0

Я не понимаю вашу проблему. Все еще разделитель не расположен посередине? – Masudul

+0

Да :(У меня есть обновленная версия моего сообщения, чтобы иметь полный код обзора. Вы можете взглянуть на него. Я боюсь, что из-за некоторой проблемы при разработке макета. – hqt

5

Это действительно зависит от точного поведения, которое вы хотите использовать для панели разделения.

Вы можете использовать:

splitPane.setResizeWeight(0.5f); 

при создании разделенной панели. Это влияет на то, как пространство присваивается каждому компоненту при изменении размера области разделения. Поэтому при запуске это будет 50/50. По мере увеличения размера разделенной панели дополнительное пространство также будет разделено на 50/50;

splitPane.setDividerLocation(.5f); 

Это даст только начальный раскол 50/50. По мере увеличения размера разделенной панели дополнительное пространство будет переходить к последнему компоненту. Также обратите внимание, что этот метод должен быть вызван ПОСЛЕ того, как кадр был упакован или сделан видимым. Вы можете обернуть это заявление в SwingUtilities.invokeLater(), чтобы убедиться, что код добавлен в конец EDT.

+0

as @peeskillet использует: D спасибо за более ясное объяснение: D – hqt

+0

@hqt ответы правильные, много раз Q & A здесь, должны быть завернуты в invokeLater – mKorbel

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