- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个带有按钮的 jpanel (jpanel A),按下时将打开一个选项卡 jpanel(示例 1)
因此,当您按下按钮时,您最终会看到 2 个选项卡 jpanel A 和示例 1。
原来的 japanel 现在是一个选项卡式面板
当我删除示例 1 时,我只剩下 jpanel A,但是该面板位于选项卡中。 当另一个 jpanel(示例 1)被删除时,有没有办法可以恢复到原始 jpanel。
我制作了一个与我的类似的示例应用程序:
然后点击 press for tab 2 次,你会得到 2 个新标签
该应用程序分为 3 类。
这是代码:主GUI
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
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.JTabbedPane;
import javax.swing.SwingUtilities;
import javax.swing.border.EmptyBorder;
public class MainGUI extends JFrame {
private JPanel jPanelLeft;
private JPanel jPanelRight;
private JButton callPanelBtn;
private JTabbedPane tab;
public MainGUI() {
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setSize(1280, 600); // set frame size
this.setVisible(true); // display frame
this.setTitle("Tab Example");
setLayout(new BorderLayout()); // layout manager
jPanelLeft = new JPanel();
jPanelLeft.setLayout(null);
jPanelLeft.setPreferredSize(new Dimension(400, 800)); // to set the size of the left panel
jPanelLeft.setBackground(Color.blue);
this.add(jPanelLeft, BorderLayout.WEST);
callPanelBtn = new JButton("Call a jPanel");
callPanelBtn.addActionListener(btn);
callPanelBtn.setBounds(150, 200, 150, 40);
jPanelLeft.add(callPanelBtn);
jPanelRight = new JPanel();
jPanelRight.setBorder(new EmptyBorder(0, 0, 0, 0));
jPanelRight.setLayout(new GridLayout(0, 1));
this.add(jPanelRight);
tab = new CloseButtonTabbedPane();
}//endd constructor
ActionListener btn = new ActionListener() {
@Override
public void actionPerformed(ActionEvent ae) {
if (ae.getActionCommand() == "Call a jPanel") {
jPanelRight.add(new CreatePanel(t));
jPanelRight.revalidate();
}
}
};
// Actionlistener for CreatePanel
ActionListener t = new ActionListener() {
@Override
public void actionPerformed(ActionEvent ae) {
if (tab.getTabCount() <= 8) {
// if no tabs make main tab
if (tab.getTabCount() == 0) {
tab.addTab("Main Content", jPanelRight); // name for listener not to close
add(tab);
revalidate();
repaint();
}
if (tab.getTabCount() > 0) {
JPanel newJPanel = new JPanel();
tab.addTab("new ", newJPanel);
tab.setSelectedIndex(tab.getTabCount() - 1);
}
}
}
};
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new MainGUI();
}
});
} // end main
}//end class
创建面板
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JPanel;
public class CreatePanel extends JPanel {
private JPanel jPanel1;
private final JButton tabBTN;
public CreatePanel(ActionListener t){
jPanel1 = new JPanel();
jPanel1.setLayout(null);
jPanel1.setBorder(BorderFactory.createBevelBorder(1, Color.lightGray, Color.lightGray));
jPanel1.setPreferredSize(new Dimension(850, 300));
jPanel1.setBackground(Color.green);
add(jPanel1);
//add button for tabs
tabBTN = new JButton("Press for Tab");
tabBTN.setBounds(400, 100, 150, 30);
tabBTN.addActionListener(t);
jPanel1.add(tabBTN);
}//end constructor
}//end class
关闭按钮TabbedPane
import javax.swing.*;
import javax.swing.plaf.metal.MetalIconFactory;
import javax.swing.plaf.basic.BasicTabbedPaneUI;
import java.awt.image.BufferedImage;
import java.awt.*;
import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
public class CloseButtonTabbedPane extends JTabbedPane {
public CloseButtonTabbedPane() {
}
@Override
public void addTab(String title, Icon icon, Component component, String tip) {
super.addTab(title, icon, component, tip);
int count = this.getTabCount() - 1;
setTabComponentAt(count, new CloseButtonTab(component, title, icon));
}
@Override
public void addTab(String title, Icon icon, Component component) {
addTab(title, icon, component, null);
}
@Override
public void addTab(String title, Component component) {
addTab(title, null, component);
}
public class CloseButtonTab extends JPanel {
private Component tab;
public CloseButtonTab(final Component tab, String title, Icon icon) {
this.tab = tab;
setOpaque(false);
FlowLayout flowLayout = new FlowLayout(FlowLayout.CENTER, 3, 3);
setLayout(flowLayout);
setVisible(true);
JLabel jLabel = new JLabel(title);
jLabel.setIcon(icon);
add(jLabel);
JButton button = new JButton(MetalIconFactory.getInternalFrameCloseIcon(16));
button.setMargin(new Insets(0, 0, 0, 0));
button.setBorder(BorderFactory.createLineBorder(Color.LIGHT_GRAY, 1));
button.addMouseListener(new MouseListener() {
public void mouseClicked(MouseEvent e) {
JTabbedPane tabbedPane = (JTabbedPane) getParent().getParent();
if (tabbedPane.getSelectedIndex() >= 1) {
tabbedPane.remove(tab);
}
}
public void mousePressed(MouseEvent e) {
}
public void mouseReleased(MouseEvent e) {
}
public void mouseEntered(MouseEvent e) {
JButton button = (JButton) e.getSource();
button.setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY, 1));
}
public void mouseExited(MouseEvent e) {
JButton button = (JButton) e.getSource();
button.setBorder(BorderFactory.createLineBorder(Color.LIGHT_GRAY, 1));
}
});
add(button);
}
}
}
最佳答案
我不知道是否有工厂解决方案,但对于所有 JComponent
,您可以设置一个处理外观和感觉的自定义 UI 对象,即使用 setUI
方法的外观。 JTabbedPanes
的一种实现称为 BasicTabbedPaneUI
,并具有一个 calculateTabAreaHeight
方法,用于计算顶部选项卡栏的高度。
因此,您可以将自己的 BasicTabbedPaneUI
实例设置为 JTabbedPane
并覆盖此方法,以便在仅存在一个选项卡时返回 0
。
将其放入您的构造函数中
[...]
tab = new CloseButtonTabbedPane();
tab.setUI(new BasicTabbedPaneUI(){
@Override
protected int calculateTabAreaHeight(int tabPlacement, int horizRunCount, int maxTabHeight){
if (tab.getTabCount() == 1) return 0;
return super.calculateTabAreaHeight(tabPlacement, horizRunCount, maxTabHeight);
}
});
关于java删除选项卡并将jpanel恢复为原始状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35577557/
我正在通读 Windows Phone 7.5 Unleashed,有很多代码看起来像这样(在页面的代码隐藏中): bool loaded; protected override void OnNav
在cgi服务器中,我这样返回 print ('Status: 201 Created') print ('Content-Type: text/html') print ('Location: htt
我正在查看 esh(easy shell)的实现,无法理解在这种情况下什么是 22 和 9 信号。理想情况下,有一个更具描述性的常量,但我找不到列表。 最佳答案 信号列表及其编号(包括您看到的这两个)
我的Oozie Hive Action 永远处于运行模式。 oozie.log文件中没有显示错误。
我正在编写一个使用 RFCOMM 通过蓝牙连接到设备的 Android 应用程序。我使用 BluetoothChat 示例作为建立连接的基础,大部分时间一切正常。 但是,有时由于出现套接字已打开的消息
我有一个云调度程序作业,它应该每小时访问我的 API 以更新一些价格。这些作业大约需要 80 秒才能运行。 这是它的作用: POST https://www.example.com/api/jobs/
我正在 Tomcat 上访问一个简单的 JSP 页面: 但是当我使用 curl 测试此页面时,我得到了 200 响应代码而不是预期的 202: $ curl -i "http://localhos
有时 JAR-RS 客户端会发送错误的语法请求正文。服务器应响应 HTTP status 400 (Bad Request) , 但它以 HTTP status 500 (Internal Serve
我正在尝试通过 response.send() 发送一个整数,但我不断收到此错误 express deprecated res.send(status): Use res.sendStatus(sta
我已经用 Excel 和 Java 做过很多次了……这次我需要用 Stata 来做,因为保存变量更方便'labels .如何将 dataset_1 重组为下面的 dataset_2? 我需要转换以下
我正在创建一个应用程序,其中的对象具有状态查找功能。为了提供一些上下文,让我们使用以下示例。 帮助台应用程序,其中创建作业并通过以下工作流程移动: 新 - 工作已创建但未分配 进行中 - 分配给工作人
我想在 Keras 中运行 LSTM 并获得输出和状态。在 TF 中有这样的事情 with tf.variable_scope("RNN"): for time_step in range
有谁知道 Scala-GWT 的当前状态 项目? 那里的主要作者 Grzegorz Kossakowski 似乎退出了这个项目,在 Spring 中从事 scalac 的工作。 但是,在 interv
我正在尝试编写一个 super 简单的 applescript 来启动 OneDrive App , 或确保打开,当机器的电源设置为插入时,将退出,或确保关闭,当电源设置为电池时。 我无法找到如何访问
目前我正在做这样的事情 link.on('click', function () { if (link.attr('href') !== $route.current.originalPath
是否可以仅通过查看用户代理来检测浏览器上是否启用/禁用 Javascript。 如果是,我应该寻找什么。如果否,检测用户浏览器是否启用/禁用 JavaScript 的最佳方法是什么 最佳答案 不,没有
Spring 和 OSGi 目前的开发状况如何? 最近好像有点安静了。 文档的最新版本 ( http://docs.spring.io/osgi/ ) 来自 2009 年。 我看到一些声明 Sprin
我正在从主函数为此类创建一个线程,但即使使用 Thread.currentThread().interrupt() 中断它,输出仍然包含“Still Here”行。 public class Writ
为了满足并发要求,我想知道如何在 Godog 中的多个步骤之间传递参数或状态。 func FeatureContext(s *godog.Suite) { // This step is ca
我有一个UIButton子类,它不使用UIImage背景,仅使用背景色。我注意到的一件事是,当您设置按钮的背景图像时,有一个默认的突出显示状态,当按下按钮时,该按钮会稍微变暗。 这是我当前的代码。
我是一名优秀的程序员,十分优秀!