我有一个JSplitPane,显示时应该将窗格分割50%.
现在,给setDividerLocation提供0.5(如建议)的参数,Java似乎将其视为正常数字而不是百分比.在中,分隔符,而不是到窗格的中间,几乎在左窗格的开头(窗格是垂直分割).有什么工作吗?
有没有办法检测何时移动JSplitPane分隔线?有没有办法为分频器移动添加一个监听器?
JPanel panel1 = new JPanel();
JPanel panel2 = new JPanel();
JSplitPane sp = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, panel1, panel2);
// What do I put here to be notified if the divider in sp is moved?
Run Code Online (Sandbox Code Playgroud) 我有一个JFrame
with BorderLayout
作为布局管理器.
在南边界,我有一个JPanel
,我希望这个JPanel
尺寸可以由用户调整,即用户可以点击边框的边缘并将其向上拖动以使其更大.
有什么方法你知道我能做到吗?
我正在尝试设置JSplitPane的分隔符位置,但似乎无法正常工作.
这是一个SSCCE:
import java.awt.Color;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSplitPane;
public class JSplitProblem extends JFrame {
public JSplitProblem(){
JPanel upperPanel = new JPanel();
upperPanel.setLayout(new BoxLayout(upperPanel, BoxLayout.X_AXIS));
JPanel leftPanel = new JPanel();
leftPanel.setLayout(new BoxLayout(leftPanel, BoxLayout.Y_AXIS));
JPanel red = new JPanel();
red.setBackground(Color.red);
leftPanel.add(red);
JPanel rightPanel = new JPanel();
rightPanel.setLayout(new BoxLayout(rightPanel, BoxLayout.Y_AXIS));
JPanel blue = new JPanel();
blue.setBackground(Color.blue);
rightPanel.add(blue);
upperPanel.add(leftPanel);
upperPanel.add(rightPanel);
JPanel bottomPanel = new JPanel();
bottomPanel.setBackground(Color.black);
JSplitPane mainSplittedPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, upperPanel,bottomPanel);
mainSplittedPane.setOneTouchExpandable(true);
mainSplittedPane.setDividerLocation(0.5);
this.add(mainSplittedPane);
this.setSize(800,600);
this.setResizable(true);
this.setVisible(true);
}
public …
Run Code Online (Sandbox Code Playgroud) 当我打电话时JTable#scrollRectToVisible
,我想要显示的行在某些情况下隐藏在标题下方.
这个问题的其余部分仅在使用以下代码时才有意义.这是一个非常简单的程序,我用它来说明问题.它显示了一个UI JSplitPane
,其上部包含一些控制按钮,下部包含一个JTable
包裹在a中的JScrollPane
(参见本文底部的屏幕截图).
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
public class DividerTest {
private final JSplitPane fSplitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
private final JTable fTable;
private final JScrollPane fScrollPane;
private boolean fHideTable = false;
public DividerTest() {
fTable = new JTable( createTableModel(50));
fScrollPane = new JScrollPane(fTable);
fSplitPane.setBottomComponent(fScrollPane);
fSplitPane.setTopComponent(createControlsPanel());
fSplitPane.setDividerLocation(0.5);
}
private JPanel createControlsPanel(){
JPanel result = new JPanel();
result.setLayout(new BoxLayout(result, BoxLayout.PAGE_AXIS));
final JCheckBox checkBox …
Run Code Online (Sandbox Code Playgroud) 我有一个带有JSplitPane的JFrame,它是OneTouchExpandable.我想记住JFlitPane在JFrame上的最后一个Divider位置处理,如果重新打开JFrame,则恢复Position.
它运行良好,但是如果用户通过oneTouchExpandable UI-Widget扩展一侧,那么我只存储处理中的'int'-Position并再次设置'int'-Position,结果是JFrame调整JSplitPane-Divider的大小跳转到折叠的Component preferredSize.
如何获取/设置崩溃/展开状态?
编辑
现在:调整大小行为是正常的,但它与第一次打开的行为不完全相同 - 因为现在我没有MinimumDividerLocation.我想要SnapIn,但需要进一步折叠状态.
public class SplitPaneState {
public static void main( String[] args ) {
SwingUtilities.invokeLater( new Runnable() {
@Override
public void run() {
new SplitPaneState().createAndSowGUI();
}
});
}
private int position = -1;
private Dimension size = new Dimension( 500, 300 );
private void createAndSowGUI() {
final JFrame frame = new JFrame("frame");
frame.setSize( 200, 100 );
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
frame.setLocationRelativeTo( null );
frame.getContentPane().add( new JButton( new AbstractAction(){
{
putValue( Action.NAME, "Open Dialog" ); …
Run Code Online (Sandbox Code Playgroud) 我正在使用NetBeans GUI编辑器创建一个应用程序,我希望在其中有一个JSplitPane
,其顶部组件将Canvas
在a中JScrollPane
,而底部组件将是a JTextArea
或类似的东西.
当我向下拉分隔器,从而增加顶部组件的大小时,一切似乎都调整得很好.
当我试图向上推动分频器时出现问题:分频器似乎在Canvas
(也可能在它下面JScrollPane
)下方.
我试图首选/最小/最大的尺寸的各种组合JScrollPane
和Canvas
,但似乎没有任何工作.
这是Netbeans生成的代码的一部分,可能与手头的问题有关:
jSplitPane1 = new javax.swing.JSplitPane();
jScrollPane1 = new javax.swing.JScrollPane();
canvas1 = new java.awt.Canvas();
jTextField1 = new javax.swing.JTextField();
jSplitPane1.setDividerLocation(300);
jSplitPane1.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT);
jScrollPane1.setViewportView(canvas1);
jSplitPane1.setTopComponent(jScrollPane1);
jTextField1.setText("jTextField1");
jSplitPane1.setRightComponent(jTextField1);
Run Code Online (Sandbox Code Playgroud)
由于这是我的第一个问题,我不允许在问题中嵌入图像,因此我将发布链接:
红色箭头表示分隔线的位置.
在此先感谢您的时间.
这个JScrollPane
基于窗口的顶部是JSplitPane
.
getBounds()
,getWidth()
,getHeight()
都返回窗口的全尺寸,包括无形的(滚动)的一部分.
我只想知道可见部分的尺寸.
所以,我的问题归结为这个...默认的分隔符有点难看,而且我想为它添加一个标签(在I-want-text-on-it意义上,而不是在"添加JLabel"它的布局"感觉".我看到您可以更改拆分窗格分隔符上的边框,但是当我这样做时,它会删除我想要保留的单触箭头.
有关我如何兼顾两者的任何想法?
这是一个SSCCE,它演示了默认行为以及更改分隔符边框时发生的情况:
import javax.swing.*;
import javax.swing.plaf.basic.BasicSplitPaneDivider;
import javax.swing.plaf.basic.BasicSplitPaneUI;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class SplitPaneFun {
public static void main(String[] args) {
//Here I'm messing around with the divider look. This seems to remove the one-touch arrows. These blocked-out lines illustrate
// what I'm doing to modify the divider's border. Does this look right?:
//------------------------------------------------------------------------------------------------
JSplitPane withCustomDivider = new JSplitPane(JSplitPane.VERTICAL_SPLIT, new JPanel(), new JPanel());
BasicSplitPaneDivider divider = ( (BasicSplitPaneUI) withCustomDivider.getUI()).getDivider();
withCustomDivider.setOneTouchExpandable(true);
divider.setDividerSize(15);
divider.setBorder(BorderFactory.createTitledBorder(divider.getBorder(), "Custom border title -- …
Run Code Online (Sandbox Code Playgroud) 下面是使用多个嵌套创建的简单布局的代码JSplitPanes
.
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSplitPane;
public class CDBurner extends JFrame {
private static final long serialVersionUID = -6027473114929970648L;
JSplitPane main, folder, rest;
JPanel centeral, folders, favourites, tasks;
JLabel label;
private CDBurner() {
super("Dan's CD Burner");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new GridLayout(1, 1));
getContentPane().setBackground(Color.black);
createLayout();
pack();
setMinimumSize(getSize());
setExtendedState(getExtendedState() | JFrame.MAXIMIZED_BOTH);
setVisible(true);
requestFocus();
}
private void createLayout() {
createPanels();
rest = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, centeral, tasks);
rest.setResizeWeight(1);
rest.setContinuousLayout(true);
rest.setOneTouchExpandable(true);
folder = new JSplitPane(JSplitPane.VERTICAL_SPLIT, favourites, …
Run Code Online (Sandbox Code Playgroud)