Hauptfenster erhält schmale Streifen rechts unt unten, wenn ich einen JDialog hinzufüge.

Drachenbauer

Aktives Mitglied
Hallo

Mein Spiel besteht aus einem JFrame als Hauptfenster, das ein JPanel mit dem Spielfeld enthält.

das JPanel hat Maße, die ich für das Spielfeld vorgegeben habe und im JFrame benutze ich:

Java:
        setResizable(false);
        pack();

damit es das JPanel genau umschließt.

Bisher sah es auch wie gewünscht aus.

Aber als ich im JPanel eine instanz von einem JDialog erzeugt habe:
Java:
LevelDialog level_dialog = new LevelDialog("Choose Level", true, level_number, solved);
gab es beim hauptfenster plötzlich so schmale Streifen am rechten und unteren Rand, die aussehen, wie für Scrollbars.
Fenster.png

Ich habe getestet, was dazu führt, indem ich mal alle Zeilen, die mit dem JDialog zutun haben, auskommentiert habe ("//" davor) und dann das Spiel getestet.

Dann waren diese Streifen weg.

Und als ich dann mal zunächst die oben gezeigte Zeile, die die Instanz erzeugt, wieder reaktiviert habe, waren die Rand-Streifen wieder da.

Was kann ich tun, damit die Streifen auch dann nicht erscheinen, wenn ich den JDialog in meinem Programm weiterhin nutze?
 

Drachenbauer

Aktives Mitglied
Ich kann mir nicht vorstellen, dass die Veränderung im Aussehen des JFrame mit dem JPanel etwas mit dem inhalt der Klasse des LevelDialogs zutun haben soll.
Der Level-Dialog dient dazu, eines der im Spiel vorhandenen Level zum Spielen auszuwählen.

es scheint irgendwie das erstellen der Instanz des Dialoges zusein.

aber hier ist trotzdem noch der inhalt der Klasse von dem Dialog.
Java:
package main.com.zetcode;

import java.awt.Component;
import java.awt.Dimension;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.ListCellRenderer;
import javax.swing.SwingConstants;

@SuppressWarnings("serial")
public class LevelDialog extends JDialog
{
    private JPanel contentPane = new JPanel();
    private JLabel text = new JLabel("Choose your level!", SwingConstants.CENTER);
    @SuppressWarnings("rawtypes")
    public JComboBox levelList;
    public JButton okButton = new JButton("OK");
    
    private Levels levels = new Levels();
    
    private ImageIcon[] images;
    private int selectedIndex;
    private Integer[] intArray;
    
    private int level_number;
    public int[] solved = new int[levels.levels.size()];
    
    @SuppressWarnings({ "unchecked", "rawtypes" })
    public LevelDialog(String title, boolean modal, int level_number, int[] solved)
    {
        super();
        setDefaultCloseOperation(HIDE_ON_CLOSE);
        setModal(modal);
        setTitle(title);
        
        this.level_number = level_number;
        this.solved = solved;
        
        setSolvedGraphics();
        
        levelList= new JComboBox(intArray);
        ComboBoxRenderer renderer= new ComboBoxRenderer();
        renderer.setPreferredSize(new Dimension(120, 32));
        levelList.setRenderer(renderer);
        
        contentPane.setLayout(null);
        
        contentPane.add(text);
        text.setLocation(16, 16);
        text.setSize(224, 32);
        
        contentPane.add(levelList);
        levelList.setLocation(16, 80);
        levelList.setSize(224, 40);
        levelList.setMaximumRowCount(10);
        levelList.setSelectedIndex(selectedIndex);
        
        contentPane.add(okButton);
        okButton.setLocation(16, 144);
        okButton.setSize(224, 32);
        
        add(contentPane);
        contentPane.setPreferredSize(new Dimension(256, 192));
        
        setResizable(false);
        pack();
    }
    
    @SuppressWarnings("unused")
    public void setSolvedGraphics()
    {
        images = new ImageIcon[levels.levels.size()];
        intArray = new Integer[levels.levels.size()];
        
        int i = 0;
        
        for (String level : levels.levels)
        {
            intArray[i] = i;
            
            if (solved[i] == 1)
            {
                images[i] = new ImageIcon("src/main/resources/level_solved.png");
            }
            else
            {
                images[i] = new ImageIcon("src/main/resources/box_2.png");
            }
            
            if (intArray[i] == level_number)
            {
                selectedIndex = i;
            }
            
            i++;
        }
    }
    
    @SuppressWarnings({ "rawtypes" })
    class ComboBoxRenderer extends JLabel implements ListCellRenderer
    {
        public ComboBoxRenderer()
        {
            setOpaque(true);
            setHorizontalAlignment(CENTER);
            setVerticalAlignment(CENTER);
            level_number = selectedIndex;
        }
        
        @Override
        public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus)
        {
            int selectedIndex = ((Integer)value).intValue();
            
            if (isSelected)
            {
                setBackground(list.getSelectionBackground());
                setForeground(list.getSelectionForeground());
                level_number = selectedIndex;
            }
            else
            {
                setBackground(list.getBackground());
                setForeground(list.getForeground());
            }
            
            ImageIcon icon = images[selectedIndex];
            
            setIcon(icon);
            setText("Level " + selectedIndex);
            setFont(list.getFont());
            
            return this;
        }
    }
}
 

mihe7

Top Contributor
Ich kann mir nicht vorstellen, dass die Veränderung im Aussehen des JFrame mit dem JPanel etwas mit dem inhalt der Klasse des LevelDialogs zutun haben soll.
Du wirst nicht glauben, worauf die Leute alles kommen :) Bei Dir sieht aber alles ok aus, Du zeigst ja noch nicht mal was an.

Damit ich das jetzt richtig verstehe: Du machst nichts anderes als den Konstruktor aufzurufen und dann zeigt Dein JFrame diese Streifen? Kannst Du mal einen JFrame basteln, so dass man das mal ausprobieren kann, ggf. liegt es an den Java-Versionen.
 

Drachenbauer

Aktives Mitglied
bei dem Spiel sind die Streifen gekommen, als ich die Dialoge für Einstellungen hinzugefügt habe.

Ich habe verschiedene Versionen des Spieles mit verschiedenen Grafik-Sets und eine mit einem modifizierten Level-Ende (Treppe betreten nach dem Einräumen der Kisten)

Sie alle haben diese komischen streifen am Rand, nachtem ich die Dialoge hinzugefügt habe.

also muss es an irgendetwas liegen, das sie alle enthalten.
 

mihe7

Top Contributor
Scheint tatsächlich ein anderes Problem zu sein: bei mir funktioniert das unter Linux mit Java 8 und 12 einwandfrei. Welche Java-Version hast Du im Einsatz?
 

Drachenbauer

Aktives Mitglied
Ich benutze Windows 10 und Java 8

also hat das Spiel bei dir keine "Scrollbar-Streifen"

ich habe jetzt bei dem einfachen Test-Fenster die hintergrundfarbe auf die gleiche Weise wie bei dem Spiel erzeugt:
Java:
g.fillRect(0, 0, 512, 512);
Die größe des JPanels steht auf den gleichen Werten:
Java:
contentPane.setPreferredSize(new Dimension(512, 512));
Nun entstehen auch hier die streifen, wenn die Zeile, die die instanz des Dialoges erzeugt, aktiv ist (auch wenn noch nichts existiert, das den JDialog aufruft).
Ich glaube, das JPanel vergrößert sich um diese Streifen, denn ich habe zunächst eine hintergrundfarbe direkt zugewiesen und dann wie im Spiel das Rechteck erzeugt, und zwar in einer anderen Farbe.
Die streifen haben hier jetzt die direkte Hintergrund-Farbe des JPanels
 
Zuletzt bearbeitet:

mihe7

Top Contributor
Beim Aufruf. Du musst ja erst einmal schauen, ob sich dadurch etwas ändert und falls ja, dann liegt es am Zusammenspiel Deiner Treiber mit Java und ist IMO nichts, was man grundsätzlich einstellt.
 

mihe7

Top Contributor
Wie rufst Du denn aktuell Dein Spiel auf? Über die IDE? Da gibt es Optionen, wo Du der VM Argumente mitgeben kannst, da schreibst Du dann z. B. -Dnoddraw=true rein.
 

Drachenbauer

Aktives Mitglied
Aktuell rufe ich es über die Testlauf-funktion von Eclipse auf.

Ich hätte gerne eine Lösung, die ich direkt in eine von meinen Klassen schreiben kann.

Wenn ich dein Beispiel in die VM-Argumente für meine Testläufe schreibe, zeigt es trotzdem diese Streifen.
 

mihe7

Top Contributor
Aktuell rufe ich es über die Testlauf-funktion von Eclipse auf.
Wo man das in Eclipse einstellt, weiß ich nicht; schätzungsweise in irgendeiner Run Configuration (oder wie das bei Eclipse heißt).

Ich hätte gerne eine Lösung, die ich direkt in eine von meinen Klassen schreiben kann.
Wenn es an DirectDraw liegt, dann ist das kein Problem Deiner Anwendung. Du kannst in Deinem Programm nicht sämtliche Fehler anderer Software ausmerzen. Wenn es an DirectDraw liegt, dann kann es sein, dass sich das Problem z. B. schon nach einem Update des Grafikkartentreibers erledigt hat. Es kann auch sein, dass das Problem in einer aktuellen Java-Version nicht auftritt usw.
 

mihe7

Top Contributor
Wenn ich dein Beispiel in die VM-Argumente für meine Testläufe schreibe, zeigt es trotzdem diese Streifen.
Das Problem ist, dass ich das Phänomen hier nicht nachvollziehen kann. D. h. das ist im Moment alles reines Rumgestochere. Evtl. probier ich es nachher mal unter Windows.

Kannst Du mal testweise setResizable(false); entfernen?

Hast Du mit den anderen Flags auch rumgespielt oder nur mit ddraw?
 

Ähnliche Java Themen

Neue Themen


Oben