2014-02-17 9 views
2

Я искал в Интернете решение этой проблемы и не нашел ничего, что сработало.Как установить размер JSlider?

У меня есть вертикальный JSlider внутри JPanel, который использует GridBagLayout и GridBagConstraints для позиционирования объектов на панели.

В настоящее время у меня есть следующий код:

gbc.gridy = 1; 
    add(button1,gbc); 

    gbc.gridy = 2; 
    add(button2,gbc); 

    gbc.gridy = 3; 
    add(slider,gbc); 

Объекты расположены вертикально вдоль панели.

Ползунок всегда отображается в том же размере (длина). Пытался использовать setPreferredSize - не работал. Пытался использовать gridheight, чтобы переместиться на ползунок в два ряда - тоже не работал. Пытался изменить фактические минимальные и максимальные значения слайдера, не помогло.

Не должен GridBagLayout уважать предпочтительный размер?

EDIT: Также попытался создать anoter JPanel внутри основного JPanel, установить его макет FlowLayout, BoxLayout или GridLayout и добавить к нему ползунок. Ничего не изменил. Очень странно.

Любые идеи?

+0

Чтобы лучше помочь, отправьте сообщение [MCTaRE] (http://stackoverflow.com/help/mcve) (минимальный полный протестированный и читаемый пример). –

ответ

3

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

enter image description here

import java.awt.BorderLayout; 
import java.awt.GridLayout; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 
import javax.swing.JSlider; 
import javax.swing.SwingUtilities; 

public class DifferentSizeSlider extends JPanel{ 
    public DifferentSizeSlider() { 
     JPanel topPanel = new JPanel(new BorderLayout()); 
     topPanel.add(new JSlider()); 

     JPanel bottomPanel = new JPanel(new GridLayout(1, 2)); 
     bottomPanel.add(new JSlider()); 
     bottomPanel.add(new JPanel()); 

     setLayout(new GridLayout(2, 1)); 
     add(topPanel); 
     add(bottomPanel); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable(){ 
      public void run() { 
       JOptionPane.showMessageDialog(null, new DifferentSizeSlider()); 
      } 
     }); 
    } 
} 

EDIT с вашим примером кода

enter image description here

import java.awt.BorderLayout; 
import java.awt.Dimension; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import javax.swing.JButton; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 
import javax.swing.JSlider; 
import javax.swing.SwingUtilities; 

public class DifferentSizeSlider extends JPanel{ 
    public DifferentSizeSlider() { 
     JPanel topPanel = new JPanel(new BorderLayout()); 
     topPanel.setPreferredSize(new Dimension(400, 50)); 
     topPanel.add(new JSlider()); 

     JButton jbtOne = new JButton("Button"); 
     JButton jbtTwo = new JButton("Button"); 

     GridBagConstraints gbc = new GridBagConstraints(); 
     setLayout(new GridBagLayout()); 

     gbc.gridy = 0; 
     add(jbtOne,gbc); 

     gbc.gridy = 1; 
     add(jbtTwo,gbc); 

     gbc.gridy = 2; 
     add(topPanel, gbc); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable(){ 
      public void run() { 
       JOptionPane.showMessageDialog(null, new DifferentSizeSlider()); 
      } 
     }); 
    } 
} 
+0

Спасибо, но по какой-то причине все еще не работает. Я поместил свой JSlider в JPanel с FlowLayout, установил предпочтительный размер для JPanel и добавил его к основному JPanel. Все еще ничего не менял. Пробовал несколько разных предпочтительных размеров, все равно не помог. Пробовал BorderLayout, BoxLayout и GridLayout, до сих пор ничего не изменилось. Есть идеи? –

+0

FlowLayout уважает предпочтительный размер слайдера. Вам нужен макет, который не работает. –

+0

Я также пробовал BorderLayout. Разница в результате, полученная двумя макетами, заключалась в том, что макет потока заставил слайдер выглядеть «обрезанным» по краям, как будто он не подходит для его ячейки, а макет границы уменьшил ползунок до небольшого размера (моя текущая проблема) , Я думаю, моя проблема в том, что основной JPanel не учитывает предпочтительный размер вложенного JPanel. и для некоторого резонанса, используя 'gbc.gridheight', чтобы вложенная панель пересекала две ячейки, ничего не меняет –

1

Чтобы изменить размер качелей компонент используется метод setPrefferedSize()

setPreferredSize(new Dimension(300, 80)); 

Вы, возможно, придется использовать отдельную панель с FlowLayout для слайдера затем добавить эту панель в. Некоторые менеджеры макетов могут не принимать предпочтительный размер.

+1

Спасибо за ваш ответ. Как я писал в вопросе, я пробовал этот метод, и он ничего не менял. Странно, так как я хотя «GridBagLayout' должен уважать предпочтительные размеры.Не должно быть? –

+0

Я не знаком с GridBagLayout, но у меня была аналогичная проблема с использованием JTable. Мне пришлось приложить панели для того, чтобы принять значение setPrefferedSize(). – jmw5598

+0

http: //docs.oracle.com/javase/tutorial/uiswing/layout/gridbag.html Эта ссылка может быть полезна. Вы можете установить ограничения, поэтому компоненты охватывают несколько столбцов или несколько строк. Вы можете ограничить ползунок одной ячейкой. – jmw5598

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