/ / JTabbedPane FlowLayout vyvolá ArrayIndexOutOfBoundsException - java, swing, jtabbedpane, indexoutofoundoundseception, flowlayout

JTabbedPane FlowLayout hodí ArrayIndexOutOfBoundsException - java, swing, jtabbedpane, indexoutofboundsexception, flowlayout

Snažím sa aplikovať rozloženie toku na JTabbedPane, aby som mohol nastaviť hgap (0) a vgap (0). Predvolené rozloženie pre JTabbedPane ponecháva medzery všade.

Keď sa pokúsim nastaviť rozloženie, zaznie nasledujúci kód:

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.lang.reflect.InvocationTargetException;

import javax.swing.*;


public class Main {

public static void main(String[] args) {
try {
SwingUtilities.invokeAndWait(new Runnable() {
@Override public void run() {
JFrame F = new JFrame("Testing");
F.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JTabbedPane Pane = new JTabbedPane();
Pane.setLayout(new FlowLayout(0, 0, FlowLayout.CENTER));
F.setLayout(new BorderLayout());
F.add(Pane, BorderLayout.CENTER);

Pane.addTab("Hello", new JPanel());
F.pack();
F.setVisible(true);
}
});
} catch (InvocationTargetException | InterruptedException e) {
e.printStackTrace();
}
}
}

Čo vidím bez rozloženia toku: tu zadajte popis obrázku

Chcem odstrániť tyrkysovo vyzerajúcu hranicuokolo Black JPanel. Nechcem kartu odstrániť. Chcem iba odstrániť priestor medzi kartou a komponentom. Chcem odstrániť priestor okolo komponentu, ktorý na obrázku vyššie vyzerá modro-ish.

Prečo vyvoláva výnimku, ktorá hovorí, že ArrayIndexOutOfBounds:

Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 0
at javax.swing.plaf.basic.BasicTabbedPaneUI.paintTabArea(Unknown Source)
at javax.swing.plaf.basic.BasicTabbedPaneUI.paint(Unknown Source)
at javax.swing.plaf.metal.MetalTabbedPaneUI.paint(Unknown Source)
at javax.swing.plaf.metal.MetalTabbedPaneUI.update(Unknown Source)
at javax.swing.JComponent.paintComponent(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JLayeredPane.paint(Unknown Source)
at javax.swing.JComponent.paintChildren(Unknown Source)
at javax.swing.JComponent.paintToOffscreen(Unknown Source)
at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(Unknown Source)
at javax.swing.RepaintManager$PaintManager.paint(Unknown Source)
at javax.swing.RepaintManager.paint(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at java.awt.GraphicsCallback$PaintCallback.run(Unknown Source)
at sun.awt.SunGraphicsCallback.runOneComponent(Unknown Source)
at sun.awt.SunGraphicsCallback.runComponents(Unknown Source)
at java.awt.Container.paint(Unknown Source)
at java.awt.Window.paint(Unknown Source)
at javax.swing.RepaintManager$3.run(Unknown Source)
at javax.swing.RepaintManager$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
at javax.swing.RepaintManager.paintDirtyRegions(Unknown Source)
at javax.swing.RepaintManager.prePaintDirtyRegions(Unknown Source)
at javax.swing.RepaintManager.access$1000(Unknown Source)
at javax.swing.RepaintManager$ProcessingRunnable.run(Unknown Source)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$200(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

odpovede:

3 pre odpoveď č. 1

Nemyslím si, že sa môžete pokaziť rozložením JTabbedPane. Nemá zmysel ani to zvážiť. Pravdepodobne má svoje špeciálne usporiadanie.


Upraviť 1
A v skutočnosti to určite je: TabbedPaneLayout

Riešenie: Neporiadajte sa s rozložením JTabbedPane a určite ho nevymieňajte za ďalšie rozloženie, ktoré s JTabbedPane nebude fungovať.


Upraviť 2
uvádzate:

Ako môžem potom odstrániť medzery okolo nej? Tieto medzery nechávam všade okolo komponentu: S Skúšal som tiež iné rozloženie .. áno, oni tiež hodia.

Pravdepodobne by bolo najlepšie zmeniť rozloženiekomponenty, ktoré drží JTabbedPane, aby sa im umožnilo zmeniť veľkosť a vyplniť medzery, ale aby sme mohli úplne pochopiť, aké problémy môžu mať, ukážte obrázky toho, čo „vidíte a čo sa snažíte“ šou.


Upraviť 3
Uvádzate:

chcete odstrániť tyrkysovo vyzerajúcu hraničnú vecokolo Čierneho JPanelu. Nechcem kartu odstrániť. Chcem iba odstrániť priestor medzi kartou a komponentom. Chcem odstrániť priestor okolo komponentu, ktorý na obrázku vyššie vyzerá modro-ish.

To je pravdepodobne problém s Look & Feel a nieproblém s rozložením. Pokiaľ ide o priamu odpoveď na vašu pôvodnú otázku, odpoveď znie: nerobte si rozloženie s JTabbedPane, obdobie. Pokiaľ ide o váš problém, ktorý sa snažíte vyriešiť, zvážte použitie iného L&F, alebo ak to nefunguje, píšem svojho vlastného ui delegáta pre JTabbedPane. Ja som však nikdy nič také neurobil.