Уважаемые, есть такая проблемка. Имеется панель this, на которой лежит (CENTER) JSplitPane с вертикальным разделителем. В JSplitPane слева есть панель с размером 12 по ширине, сам разделитель имеет толщину 3, и справа панель шириной 1 (итого на всё про всё - 16). Правая панель всегда (в состоянии покоя) имеет ширину 1. Мне нужно следующее: при движении разделителя вправо ширина родителя увеличивается на единицу, при движении влево - уменьшается на 1. По этой причине и оставил правую панель шириной в единицу, ибо движения вправо иначе нету, но, как оказалось, мыслил не в ту сторону (по идее, мне вообще не нужно этой правой панели) . Код ниже: | Код | import javax.swing.*; import java.awt.*; public class start { public static void main(String[]args) { JFrame f = new JFrame(); f.setLayout(new BorderLayout()); f.setBounds(300, 200, 350, 250); f.getContentPane().setBackground(Color.gray); JPanel sb = new JPanel(); sb.setPreferredSize(new Dimension(0, 20)); sb.setBackground(Color.lightGray); sb.setLayout(new BorderLayout()); LimiterToolBar ltb = new LimiterToolBar("LR", null); sb.add(ltb, BorderLayout.WEST); f.add(sb, BorderLayout.SOUTH); f.setVisible(true); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } }
|
| Код | import java.awt.*; import java.awt.event.ComponentListener; import java.awt.event.ComponentEvent; import java.util.HashMap; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeEvent; import javax.swing.*; import javax.swing.event.AncestorListener; import javax.swing.event.AncestorEvent;
public class LimiterToolBar extends JPanel implements PropertyChangeListener, AncestorListener, ComponentListener { private String arrowOrient = "LR"; // left to right private Dimension prefSize; private JSplitPane split; private JPanel pButtons; private JPanel pEmpty;
public LimiterToolBar(String aO, Dimension prefS) { if (aO.equalsIgnoreCase("RL")) arrowOrient = aO; else if (aO.equalsIgnoreCase("LR")) arrowOrient = aO; else // "LR" - default arrowOrient = "LR";
setLayout(new BorderLayout()); if (prefS!=null) prefSize = prefS; else prefSize = new Dimension(12 + 3 + 1, 20); setPreferredSize(prefSize);
pButtons = new JPanel(); pEmpty = new JPanel(); split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT); pEmpty.setMinimumSize(new Dimension(0, 0)); pButtons.setMinimumSize(new Dimension(12, 0)); pButtons.setLayout(new FlowLayout(FlowLayout.LEFT, 0, 0));
split.setDividerSize(3); add(split, BorderLayout.CENTER); split.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0)); split.addPropertyChangeListener("dividerLocation" ,this);
if (arrowOrient.equals("LR")) { split.setLeftComponent(pButtons); split.setRightComponent(pEmpty); split.setDividerLocation( (int)(prefSize.getWidth() - 1 - split.getDividerSize()) ); } else if (arrowOrient.equals("RL")) { split.setRightComponent(pButtons); split.setLeftComponent(pEmpty); split.setDividerLocation((int)1); }
pEmpty.addComponentListener(this); }
public void propertyChange(PropertyChangeEvent evt) { if (evt.getSource()==split) { if (evt.getPropertyName().equalsIgnoreCase("dividerLocation")) { if ( ((Integer)evt.getNewValue()).intValue()==prefSize.getWidth() - split.getDividerSize()) { /*System.out.println("button increase Divider Location is: "+evt.getNewValue().toString()); prefSize = new Dimension((int)(prefSize.getWidth() + 1), (int)prefSize.getHeight()); this.setPreferredSize(prefSize); this.updateUI(); split.setDividerLocation( (int)(prefSize.getWidth() - 1 - split.getDividerSize()) );*/ } } } }
public void ancestorAdded(AncestorEvent event) { //To change body of implemented methods use File | Settings | File Templates. }
public void ancestorRemoved(AncestorEvent event) { //To change body of implemented methods use File | Settings | File Templates. }
public void ancestorMoved(AncestorEvent event) { }
public void componentResized(ComponentEvent e) { if (e.getSource()==pEmpty) { if (pEmpty.getWidth()==0) { prefSize = new Dimension((int)(prefSize.getWidth() + 1), (int)prefSize.getHeight()); this.setPreferredSize(prefSize); this.updateUI(); split.setDividerLocation( (int)(prefSize.getWidth() - 1 - split.getDividerSize()) ); } } }
public void componentMoved(ComponentEvent e) { //To change body of implemented methods use File | Settings | File Templates. }
public void componentShown(ComponentEvent e) { //To change body of implemented methods use File | Settings | File Templates. }
public void componentHidden(ComponentEvent e) { //To change body of implemented methods use File | Settings | File Templates. } }
|
Немного подправил код (от лишнего), может чего-то и повылазит, спрашивайте. В общем, оно, конечно, работает. Но (пробовал через PropertyChangeListener, ComponentListener) работает криво, то есть за одно движение разделителя вправо (влево не тестировал) панель увеличивается ровно на одну единицу (ну, как и заказывал, собственно), нет "плавности" хода. Я, наверное, не те события отслеживаю (мне нужно отследить движение, а не его окончание). Подскажите, как решить. Кстати, может есть какой управляющий компонент, который делает нечто подобное (просто я за сплитер зацепился).
|