Java 有没有办法显示/隐藏其中一个窗格?
我有一个包含两个组件a和B的JSplitPane,但有时我希望能够隐藏B,以便满足以下任一条件:Java 有没有办法显示/隐藏其中一个窗格?,java,swing,jsplitpane,Java,Swing,Jsplitpane,我有一个包含两个组件a和B的JSplitPane,但有时我希望能够隐藏B,以便满足以下任一条件: 组件A和B在JSplitPane中可见 只有组件A在JSplitPane占用的空间中可见 有办法做到这一点吗?如果您有对组件a和B的引用,您可以使用组件a或B的方法 测试代码: final JFrame f = new JFrame(); final JSplitPane jsp = new JSplitPane(); final JButton leftB = new
- 组件A和B在JSplitPane中可见
- 只有组件A在JSplitPane占用的空间中可见
有办法做到这一点吗?如果您有对组件a和B的引用,您可以使用组件a或B的方法 测试代码:
final JFrame f = new JFrame();
final JSplitPane jsp = new JSplitPane();
final JButton leftB = new JButton("Left: Hide Self");
final JButton rightB = new JButton("Right: Show Left");
jsp.setOneTouchExpandable(true);
leftB.addActionListener(new ActionListener() {
@Override public void actionPerformed(ActionEvent e) {
jsp.remove(leftB);
}
});
rightB.addActionListener(new ActionListener() {
@Override public void actionPerformed(ActionEvent e) {
jsp.setLeftComponent(leftB);
}
});
jsp.setLeftComponent(leftB);
jsp.setRightComponent(rightB);
f.add(jsp);
f.setSize(800, 600);
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
假设水平_拆分为两个组件(A在左侧,B在右侧) 下面是如何隐藏A,并让B占据splitpane的所有空间
myButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
mySplitPane.setDividerSize(0);
mySplitPane.setDividerLocation(mySplitPane.getLocation().x);
}
});
隐藏组件B并显示组件A的步骤-
...
mySplitPane.setDividerLocation(pane.getLocation().x+pane.getSize().width);
...
如果您有垂直拆分,请使用类似的方法,将x
与y
和width
与height
对于一个完整的解决方案,您必须侦听调整大小事件(如果适用)并重新计算分隔器位置(这意味着您必须将当前可见的状态存储在某个位置)见鬼,我将尝试一个解决方案
import java.awt.Dimension;
import java.awt.event.*;
import javax.swing.*;
public class Test {
public static void main(String[] args) {
JFrame frame = new JFrame();
final JPanel contentPane = (JPanel)frame.getContentPane();
final JButton leftBtn = new JButton("Left Button");
final JButton rightBtn = new JButton("Right Button");
final JSplitPane jsp = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,
leftBtn, rightBtn);
ActionListener actionListener = new ActionListener() {
public void actionPerformed(ActionEvent e) {
JButton source = (JButton)e.getSource();
if (jsp.isVisible()) {
jsp.remove(rightBtn);
jsp.remove(leftBtn);
jsp.setVisible(false);
contentPane.removeAll();
contentPane.add(source);
} else {
contentPane.removeAll();
jsp.setLeftComponent(leftBtn);
jsp.setRightComponent(rightBtn);
jsp.setDividerLocation(0.5);
jsp.setVisible(true);
contentPane.add(jsp);
}
contentPane.revalidate();
contentPane.repaint();
source.requestFocusInWindow();
}
};
rightBtn.addActionListener(actionListener);
leftBtn.addActionListener(actionListener);
contentPane.add(jsp);
contentPane.setPreferredSize(new Dimension(800, 600));
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
jsp.setDividerLocation(0.5);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
我发现满是鳗鱼版本的气垫船有问题,于是我自己做了一个 气垫船充满鳗鱼的一个作品,但图形错误出现,如果你点击一个按钮,调整帧大小,然后再次点击按钮;正如amol所说,您可能希望拆分器位置在流程中保持不变
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSplitPane;
import javax.swing.UIManager;
public class JSplitPaneShowHidePane {
public static void main(String[] args) {
JFrame frame = new JFrame();
JPanel contentPane = (JPanel)frame.getContentPane();
final JButton leftBtn = new JButton("Left Button");
final JButton rightBtn = new JButton("Right Button");
final JSplitPane jsp = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,
leftBtn, rightBtn);
ActionListener actionListener = new ActionListener() {
private int loc = 0;
public void actionPerformed(ActionEvent e) {
JButton source = (JButton)e.getSource();
if(jsp.getLeftComponent().isVisible() && jsp.getRightComponent().isVisible()){
loc = jsp.getDividerLocation();
jsp.setDividerSize(0);
jsp.getLeftComponent().setVisible(source == leftBtn);
jsp.getRightComponent().setVisible(source == rightBtn);
}else{
jsp.getLeftComponent().setVisible(true);
jsp.getRightComponent().setVisible(true);
jsp.setDividerLocation(loc);
jsp.setDividerSize((Integer) UIManager.get("SplitPane.dividerSize"));
}
}
};
rightBtn.addActionListener(actionListener);
leftBtn.addActionListener(actionListener);
contentPane.add(jsp);
frame.pack();
frame.setSize(800, 600);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
jsp.setDividerLocation(0.5);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
我使用此选项切换框架底部的日志面板:
private void toggleLogPanel()
{
if(m_logPanel.isShowing())
{
m_logDimension = m_logPanel.getSize();
m_splitpane.setBottomComponent(null);
m_splitpane.setDividerSize(0);
}
else
{
m_logPanel.setPreferredSize(m_logDimension);
m_splitpane.setBottomComponent(m_logPanel);
m_splitpane.setDividerSize(new JSplitpane().getDividerSize());
}
m_splitpane.resetToPreferredSizes();
}
这将记住并恢复组件大小。尝试
ExpandableSplitPane\setOneSideHidden
package com.legendmohe.tool.view;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.lang.reflect.Field;
import javax.swing.JButton;
import javax.swing.JSplitPane;
import javax.swing.plaf.basic.BasicSplitPaneDivider;
import javax.swing.plaf.basic.BasicSplitPaneUI;
/**
* Created by legendmohe on 2019/4/16.
*/
public class ExpandableSplitPane extends JSplitPane {
private HiddenListener mHiddenListener;
private JButton mLeftButton;
private JButton mRightButton;
//////////////////////////////////////////////////////////////////////
public ExpandableSplitPane() {
}
public ExpandableSplitPane(int newOrientation) {
super(newOrientation);
}
public ExpandableSplitPane(int newOrientation, boolean newContinuousLayout) {
super(newOrientation, newContinuousLayout);
}
public ExpandableSplitPane(int newOrientation, Component newLeftComponent, Component newRightComponent) {
super(newOrientation, newLeftComponent, newRightComponent);
}
public ExpandableSplitPane(int newOrientation, boolean newContinuousLayout, Component newLeftComponent, Component newRightComponent) {
super(newOrientation, newContinuousLayout, newLeftComponent, newRightComponent);
}
//////////////////////////////////////////////////////////////////////
public void setOneSideHidden(Component whichSide, boolean isHidden) {
if (whichSide == getLeftComponent()) {
// if right commponent hidden
if (isRightComponentHidden()) {
// show right and hide left
if (isHidden) {
clickDividerButton(mLeftButton);
clickDividerButton(mLeftButton);
}
} else if (isLeftComponentHidden()) {
// show left
if (!isHidden) {
clickDividerButton(mRightButton);
}
} else {
if (isHidden) {
clickDividerButton(mLeftButton);
}
}
} else if (whichSide == getRightComponent()) {
// if left commponent hidden
if (isLeftComponentHidden()) {
// show right and hide left
if (isHidden) {
clickDividerButton(mRightButton);
clickDividerButton(mRightButton);
}
} else if (isRightComponentHidden()) {
// show left
if (!isHidden) {
clickDividerButton(mRightButton);
}
} else {
if (isHidden) {
clickDividerButton(mRightButton);
}
}
}
}
public boolean isSideHidden(Component whichSide) {
if (whichSide == getLeftComponent()) {
return isLeftComponentHidden();
} else if (whichSide == getRightComponent()) {
return isRightComponentHidden();
}
return false;
}
@Override
public void setOneTouchExpandable(boolean expandable) {
super.setOneTouchExpandable(expandable);
if (expandable) {
final BasicSplitPaneUI ui = ((BasicSplitPaneUI) getUI());
Field keepHidden = null;
try {
keepHidden = BasicSplitPaneUI.class.getDeclaredField("keepHidden");
keepHidden.setAccessible(true);
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
final Field finalKeepHidden = keepHidden;
BasicSplitPaneDivider divider = ui.getDivider();
try {
Field leftButton = BasicSplitPaneDivider.class.getDeclaredField("leftButton");
leftButton.setAccessible(true);
Field rightButton = BasicSplitPaneDivider.class.getDeclaredField("rightButton");
rightButton.setAccessible(true);
mLeftButton = (JButton) leftButton.get(divider);
mRightButton = (JButton) rightButton.get(divider);
mLeftButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
boolean keepHidden = (boolean) finalKeepHidden.get(ui);
handleActionPerformed(mLeftButton, keepHidden);
} catch (IllegalAccessException ex) {
ex.printStackTrace();
}
}
});
mRightButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
boolean keepHidden = (boolean) finalKeepHidden.get(ui);
handleActionPerformed(mRightButton, keepHidden);
} catch (IllegalAccessException ex) {
ex.printStackTrace();
}
}
});
} catch (NoSuchFieldException | IllegalAccessException e) {
e.printStackTrace();
}
} else {
mRightButton = mLeftButton = null;
}
}
///////////////////////////////////private///////////////////////////////////
private void handleActionPerformed(JButton whichButton, boolean keepHidden) {
if (mHiddenListener != null) {
if (whichButton == mLeftButton) {
if (isNoSideHidden() && !keepHidden) {
mHiddenListener.onStateChanged(this, getLeftComponent(), true);
} else if (isRightComponentHidden() && keepHidden) {
mHiddenListener.onStateChanged(this, getRightComponent(), false);
}
} else if (whichButton == mRightButton) {
if (isNoSideHidden() && !keepHidden) {
mHiddenListener.onStateChanged(this, getRightComponent(), true);
} else if (isLeftComponentHidden() && keepHidden) {
mHiddenListener.onStateChanged(this, getLeftComponent(), false);
}
}
}
}
private void clickDividerButton(JButton leftButton) {
leftButton.doClick();
}
private boolean isNoSideHidden() {
return (getDividerLocation() >= getMinimumDividerLocation()) && (getDividerLocation() <= getMaximumDividerLocation());
}
private boolean isLeftComponentHidden() {
return getDividerLocation() <= getMinimumDividerLocation();
}
private boolean isRightComponentHidden() {
return getDividerLocation() >= getMaximumDividerLocation();
}
///////////////////////////////////listener///////////////////////////////////
public void setHiddenListener(HiddenListener hiddenListener) {
mHiddenListener = hiddenListener;
}
public interface HiddenListener {
void onStateChanged(ExpandableSplitPane pane, Component whichSide, boolean hidden);
}
}
package com.legendmohe.tool.view;
导入java.awt.Component;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.lang.reflect.Field;
导入javax.swing.JButton;
导入javax.swing.JSplitPane;
导入javax.swing.plaf.basic.BasicSplitPaneVider;
导入javax.swing.plaf.basic.BasicSplitPaneUI;
/**
*legendmohe于2019/4/16创建。
*/
公共类ExpandableSplitPane扩展了JSplitPane{
私有HiddenListener mHiddenListener;
私有JButton mLeftButton;
私人JButton mRightButton;
//////////////////////////////////////////////////////////////////////
公共ExpandableSplitPane(){
}
公共可扩展拆分窗格(int newOrientation){
超级(新方向);
}
公共可扩展拆分窗格(int-newOrientation、boolean-newContinuousLayout){
超级(新方向、新连续布局);
}
公共可扩展拆分窗格(int newOrientation、Component newLeftComponent、Component newRightComponent){
super(newOrientation、newLeftComponent、newRightComponent);
}
公共可扩展拆分窗格(int newOrientation、boolean newContinuousLayout、Component newLeftComponent、Component newRightComponent){
super(newOrientation、newContinuousLayout、newLeftComponent、newRightComponent);
}
//////////////////////////////////////////////////////////////////////
public void setOneSideHidden(组件侧边,布尔值isHidden){
if(whichSide==getLeftComponent()){
//如果右组件隐藏
如果(isRightComponentHidden()){
//显示右侧和隐藏左侧
如果(isHidden){
单击分割按钮(MLEFT按钮);
单击分割按钮(MLEFT按钮);
}
}else if(isLeftComponentHidden()){
//向左看
如果(!isHidden){
单击分割按钮(右侧按钮);
}
}否则{
如果(isHidden){
单击分割按钮(MLEFT按钮);
}
}
}else if(whichSide==getRightComponent()){
//如果让组件隐藏
如果(isLeftComponentHidden()){
//显示右侧和隐藏左侧
如果(isHidden){
单击分割按钮(右侧按钮);
单击分割按钮(右侧按钮);
}
}else if(isRightComponentHidden()){
//向左看
如果(!isHidden){
单击分割按钮(右侧按钮);
}
}否则{
如果(isHidden){
单击分割按钮(右侧按钮);
}
}
}
}
公共布尔值是隐藏的(位于其旁边的组件){
if(whichSide==getLeftComponent()){
返回isLeftComponentHidden();
}else if(whichSide==getRightComponent()){
返回isRightComponentHidden();
}
返回false;
}
@凌驾
public void setOneTouchExpandable(布尔可扩展){
super.setOneTouchExpandable(可扩展);
if(可扩展){
最终BasicSplitPaneUI ui=((BasicSplitPaneUI)getUI());
字段keepHidden=null;
试一试{
keepHidden=BasicSplitPaneUI.class.getDeclaredField(“keepHidden”);
keepHidden.setAccessible(true);
}捕获(无此字段例外){
e、 printStackTrace();
}
最终字段finalKeepHidden=keepHidden;
BasicSplitPaneDivider divider=ui.getDivider();
试一试{
Field leftButton=BasicSplitPaneVider.class.getDeclaredField(“leftButton”);
leftButton.setAccessible(true);
Field rightButton=BasicSplitPaneVider.class.getDeclaredField(“rightButton”);
rightButton.setAccessible(真);
mLeftButton=(JButton)leftButton.get(分隔符);
mRightButton=(JButton)rightButton.get(分隔符);
mLeftButton.addActionListener(新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
试一试{
布尔保持