当前位置: 首页 > 面试题库 >

JTabbedPane-具有关闭按钮参考的选项卡

堵才哲
2023-03-14
问题内容

我想在JAVA中建立一个带标签的界面,每个标签上都带有关闭按钮。为此,我使用了以下类:ButtonTabComponent

我的GUI上有一个按钮,用于创建新标签。假设我四次按下“新建标签”按钮,因此创建了四个标签:

| 标签0 | 标签1 | 标签2 | 标签3 | (每个选项卡都包含一个关闭按钮)

现在,我决定要关闭选项卡1并出现问题,当我关闭中间选项卡时,所有索引都重新排序-这意味着:

| 标签0 | 标签2 | 标签3 | (选项卡2的索引为1)

如果我现在尝试创建一个新选项卡,则会创建该选项卡,但会创建新的选项卡:

| 标签0 | 标签2 | 标签3 | 标签1 | (选项卡1没有关闭按钮)

如果再次单击“新建选项卡”,则会得到:

| 标签0 | 标签2 | 标签3 | 标签1 | 标签4 | (选项卡4很好,它有一个关闭按钮)

现在,我决定关闭选项卡2,然后得到:

| 标签0 | 标签3 | 标签1 | 标签4 | (选项卡3现在将具有索引1)

如果我创建一个新标签:

| 标签0 | 标签3 | 标签1 | 标签4 | 标签1 | (最后一个标签也没有关闭按钮)。

我相信这是由索引引起的,我在stackoverflow上读了一个类似的问题,可能的解决方案是:

将对选项卡项的引用而不是其在选项卡式窗格中的索引传递给侦听器。

我不确定该怎么做。如果有人有任何暗示,我将非常感谢。我需要为每个选项卡保持可靠的引用,因为每个选项卡都会打开一个文件,并且具有保存到文件的能力,而且选项卡索引显然不可靠。

编辑:我在代码中添加新标签的方式是:

...//main class
private final JTabbedPane pane = new JTabbedPane();
//I am using an array to store the tabs created
//I initialize the array with false. the idea was that when a new tab get created, one item in the array
//gets the true value. when the tab is closed, the array item (based on the index) is set back to false
arrTabList = new boolean[10];
        for(int i=0; i<10; i++){
            arrTabList[i] = false;
        }

...


public void newFile()  //this function opens a new tab
{
//parse the array to check the first item with false status
    for(int i=0; i<10; i++){
        if(!arrTabList[i]) {
            System.out.println("false");
            PanelCounter = i;
            break;
            }
    }
    newTab t = new newTab();   //object which contains the tab content (a bunch of graphical components, input fields mostly)
    pane.add("New Entry" + PanelCounter, t.createContentPane());   //adds the new tab to the main window
    pane.setTabComponentAt(PanelCounter, new ButtonTabComponent(pane, this));
    arrTabList[PanelCounter] = true;  //sets the item array to true
}

//when a tab is closed, this function is called in the listener:
public void decreaseCounter(int i)
{
        arrTabList[i] = false;  //sets the item array back to false
}

问题答案:

错误在于通话

pane.setTabComponentAt(PanelCounter, new ButtonTabComponent(pane, this));

您不想将按钮添加到选项卡索引,PanelCounter而是添加到刚刚创建的按钮。可以使用来获取其索引getTabCount(),这当然是太高了,因此:

pane.setTabComponentAt(pane.getTabCount()-1, new ButtonTabComponent(pane, this));


 类似资料:
  • 我在主类中有这个类,用来在我的JTabbedPane上放置一个关闭按钮。问题是,例如,我打开了三个选项卡:journal、contact和upload,而contact选项卡是当前选择的选项卡。当我尝试关闭不是选定选项卡的日记选项卡时,关闭的是当前选定的选项卡。 这就是我调用选项卡的方法:

  • 选项放在哪里 module.exports = { // ... module: { rules: [ { test: /\.vue$/, loader: 'vue-loader', options: { // `vue-loader` options } } ]

  • transformAssetUrls 类型:{ [tag: string]: string | Array<string> } 默认值: { video: ['src', 'poster'], source: 'src', img: 'src', image: ['xlink:href', 'href'], use: ['xlink:href', 'href'] } 在模板编

  • 我有一个Jframe窗口,里面有一个按钮。通过单击该按钮,它将打开一个新的JFrame窗口。但是当我关闭这个窗口时,它会自动用按钮关闭第一个Jframe窗口。当我关闭第二个Jframe窗口时,如何防止第一个Jframe窗口关闭?

  • 嗨,我有一个jFrame,我想问问用户,当单击close按钮时,他是否确定要关闭jFrame: 当他从jpanel弹出窗口中选择“否”按钮时,我该如何撤消关闭操作?

  • 我想在运行时向我的tab控件添加一个有值的按钮。许多教程展示了如何在创建与数据库连接时进行操作。有没有什么方法可以做到不连接数据库? 在我将数据输入到textbox并单击save之后,新按钮将出现在另一个表单的tab控件上。