2x JPanel im JScrollPane (Hintergrundbild in JScrollPane)

Status
Nicht offen für weitere Antworten.
G

Gast

Gast
Hallo Leute,

ist es möglich - wenn ja wie - ein JScrollPane zu erstellen, dass wie gewöhnlich ein JPanel (mit Grafikinhalt) darstellen und scrollen kann, wobei hinter dem JPanel noch ein Hintergrundbild zu sehen sein soll (evtl. als JPanel), das nicht scrollbar ist?

Danke vor ab
 

Tobias

Top Contributor
paintComponent() der ScrollPane überschreiben und Hintergrundbild manuell einfügen. Könnte allerdings kompliziert werden.
 
S

SlaterB

Gast
interessantes Problem, das mag ich doch mal selber ausprobieren,
mit einigen setOpaque()-Aufrufen scheints zu gehen:

Code:
public class TestGUI
    extends JFrame
{

    public TestGUI()
        throws Exception
    {
        JPanel front = new FrontPanel();
        front.setPreferredSize(new Dimension(200, 1200));
        front.setOpaque(false);
        front.setBorder(BorderFactory.createLineBorder(Color.RED));

        JScrollPane scroll = new JScrollPane(front);
        scroll.getViewport().setOpaque(false);
        scroll.setOpaque(false);
        scroll.setBorder(BorderFactory.createLineBorder(Color.BLUE));

        JPanel back = new BackPanel();
        back.setBorder(BorderFactory.createLineBorder(Color.GREEN));
        back.setLayout(new BorderLayout());
        back.add(scroll);

        add(back);
        setSize(300, 300);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);

    }

    public static void main(String[] args)
        throws Exception
    {
        new TestGUI();
    }
}


class BackPanel
    extends JPanel
{

    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        for (int i = 10; i < 200; i += 10)
        {
            g.drawArc(50, 50, i, i, 0, 360);
        }

    }

}


class FrontPanel
    extends JPanel
{

    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        for (int i = 10; i < 900; i += 100)
        {
            g.drawRect(40, i, 100, 30);
        }

    }

}
 
G

Gast

Gast
Also momentan habe ich noch eine Notfall-Lösung:
Ich erstelle einen Background-Panel auf dem ich den Zeichen-Panel platziere.
Dabei bettet JScrollPane den Zeichen-Panel ein und setzt den Viewport auf den Background-Panel.

Ich kann aber schlecht einschätzen, inwiefern 2 JPanels sich auf die effektive und schnelle Programmausführung auswirkt :/
 
G

Gast

Gast
Ich habe jetzt mal versucht SlaterB's Code auf meinen zu münzen. Allerdings will das Ganze noch nicht so richtig, wie ich es will. Das JScrollPane ist nicht sichtbar.
Irgendwas muss ich übersehen haben.
Hier der Code:

Die Klasse entspricht BackPanel:
Code:
public class JBackgroundPanel extends JPanel implements Constants {
    private static final Image nullImg = java.awt.Toolkit.getDefaultToolkit().getImage(PATH + "Images/Null-Layer [256x480].gif");
    
    public JBackgroundPanel() {
        this.setLayout(null);
        this.setPreferredSize(new Dimension(LEFT_SCROLLPANE_VP_WIDTH, LEFT_SCROLLPANE_VP_HEIGHT));
        this.setLocation(0, 0);
        this.setVisible(true);
    }
    
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponents(g);
        g.drawImage(nullImg, 0, 0, this);
    }
}

Die Klasse entspricht FrontPanel:

Code:
public class JLayerPanel extends JPanel implements Constants {
    private int         SCALE;
    private File        actualFile;
    private EditMapTab  upperCallingReference = null;
    private JGrid     grid;
    private TileMap  tileMap = null;
    
    public JLayerPanel(int scale, EditMapTab upperCallingReference) {
        this.SCALE                  = scale;
        this.upperCallingReference  = upperCallingReference;
        grid = new JGrid(8, 15, SCALE);
        this.setLayout(null);
        this.setPreferredSize(new Dimension(LEFT_SCROLLPANE_VP_WIDTH, LEFT_SCROLLPANE_VP_HEIGHT));
        this.setOpaque(false);
        this.setLocation(0,0);
        this.setVisible(true);
    }
public void setFile(File f) {
        this.actualFile = f;
        upperCallingReference.getZoomComboBox(0).setEnabled(true);
        try {
            this.tileMap = new TileMap(ImageIO.read(f), SCALE);
        } catch (IOException ex) {
            System.out.println("Fehler: Datei konnte nicht geladen werden.");
        }
        this.setPreferredSize(new Dimension(tileMap.getWidth()*16*SCALE, tileMap.getHeight()*16*SCALE));
        this.grid.setSize(tileMap.getWidth(), tileMap.getHeight());
    }
    
    public void setNullFile() {
        this.actualFile = null;
        tileMap = null;
        upperCallingReference.getZoomComboBox(0).setEnabled(false);
        setPreferredSize(new Dimension(LEFT_SCROLLPANE_VP_WIDTH, LEFT_SCROLLPANE_VP_HEIGHT));
    }
@Override
    public void paintComponent(Graphics g) {
        super.paintComponents(g);
        if (tileMap != null) {
            tileMap.draw(g);
        } else {
            g.drawImage(transpImg, 0, 0, this);
        }
        grid.draw(g);
    }

Und diese Klasse soll alles ausführen:

Code:
public class EditMapTab implements ActionListener, MouseListener, Constants, ScaleUpdating {
    public  int             SCALE           = 2;
    public  Tile            selectedTile    = null;

    private JBackgroundPanel bkgPanel       = new JBackgroundPanel();
    private JPaintBase      paintBase       = new JPaintBase(912, 512, this);
    private JLayerPanel     layerPanel      = new JLayerPanel(SCALE, this);

    private JPanel          leftFramePanel  = new JPanel();
    private JScrollPane     leftScrollPane  = new JScrollPane(layerPanel, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);  
    private JButton         loadTilesetBtn  = new JButton("Set laden");
    private JButton         closeTilesetBtn = new JButton("Set schließen");
    
    
    public EditMapTab(JPanel callingReference) {
                
        leftScrollPane.setSize(LEFT_SCROLLPANE_VP_WIDTH + 20, LEFT_SCROLLPANE_VP_HEIGHT + 18);
        leftScrollPane.setLocation(8, 24);
        //leftScrollPane.getViewport().setView(layerPanel);
        leftScrollPane.getViewport().setOpaque(false);
        leftScrollPane.setOpaque(false);
        leftScrollPane.addMouseListener(this);
        leftScrollPane.setVisible(true);
        
        bkgPanel.add(leftScrollPane);
        
        loadTilesetBtn.setSize(112, 24);
        loadTilesetBtn.setLocation(22, 510);
        loadTilesetBtn.addActionListener(this);
        loadTilesetBtn.setVisible(true);
        
        closeTilesetBtn.setSize(112, 24);
        closeTilesetBtn.setLocation(158, 510);
        closeTilesetBtn.addActionListener(this);
        closeTilesetBtn.setVisible(true);
        
        leftFramePanel.setLayout(null);
        leftFramePanel.setSize(256+16+20, 480+24+40);
        leftFramePanel.setLocation(16, 48);
        leftFramePanel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), "TileViewer"));
        //leftFramePanel.add(leftScrollPane);
        leftFramePanel.add(bkgPanel);
        leftFramePanel.add(loadTilesetBtn);
        leftFramePanel.add(closeTilesetBtn);
        leftFramePanel.setVisible(true);
        
        callingReference.add(leftFramePanel);
        callingReference.add(toolbar);
    }
 
S

SlaterB

Gast
versuch doch erstmal ganz nochmal ein JScrollPane in dein BackPanel einzufügen,
ohne an die graphischen Finessen zu denken, und ohne so vielzusätzliches Zeug da reinzulegen..

in ein null-Layout kann man nur Komponenten mit setBounds
oder vielleicht auch setLocation + setSitze/ setPreferredSize einfügen,

erst wenn solche Grundlagen funktionieren, kann man über höheres nachdenken
 
G

Gast

Gast
Ohje ohje -.- Hier ist der Wurm drin. Ich habe jetzt mal versucht den null-LayoutManager außen vor zu lassen. Aber es wird im JScrollPanel der Hintergrund nicht angezeigt.

Hintergrund-Klasse:
Code:
public class JBackgroundPanel extends JPanel implements Constants {
    private static final Image nullImg = java.awt.Toolkit.getDefaultToolkit().getImage(PATH + "Images/Null-Layer [256x480].gif");
    
    public JBackgroundPanel() {
        
    }
    
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(nullImg, 0, 0, this);
    }
}

Vordergrund-Klasse:
Code:
public class JLayerPanel extends JPanel implements Constants, ScaleUpdating {
    private static final Image transpImg = java.awt.Toolkit.getDefaultToolkit().getImage(PATH + "Images/transp.gif");
    private int         SCALE;
    private File        actualFile;
    private EditMapTab  upperCallingReference   = null;
    private JGrid       grid;
    private TileMap     tileMap                 = null;
    
    public JLayerPanel(int scale, EditMapTab upperCallingReference) {
        this.SCALE                  = scale;
        this.upperCallingReference  = upperCallingReference;
        grid = new JGrid(8, 15, SCALE);
    }
    
    public void setFile(File f) {
        this.actualFile = f;
        upperCallingReference.getZoomComboBox(0).setEnabled(true);
        try {
            this.tileMap = new TileMap(ImageIO.read(f), SCALE);
        } catch (IOException ex) {
            System.out.println("Fehler: Datei konnte nicht geladen werden.");
        }
        this.setPreferredSize(new Dimension(tileMap.getWidth()*16*SCALE, tileMap.getHeight()*16*SCALE));
        this.grid.setSize(tileMap.getWidth(), tileMap.getHeight());
    }
    
    public void setNullFile() {
        this.actualFile = null;
        tileMap = null;
        upperCallingReference.getZoomComboBox(0).setEnabled(false);
        setPreferredSize(new Dimension(LEFT_SCROLLPANE_VP_WIDTH, LEFT_SCROLLPANE_VP_HEIGHT));
    }
    
    public Image getTileImageAt(int x, int y) {
        return tileMap.tile[x][y].img;
    }
    public Tile getTileAt(int x, int y) {
        return this.tileMap.tile[x][y];
    }
    public int getTileAtX(int x) {
        return Math.round(x/(16*SCALE));
    }
    public int getTileAtY(int y) {
        return Math.round(y/(16*SCALE));
    }
    
   
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponents(g);
        if (tileMap != null) {
            tileMap.draw(g);
        } else {
            g.drawImage(transpImg, 0, 0, this);
        }
        grid.draw(g);
    }
    
    @Override
    public void updateScale(int newScale) {
        this.SCALE = newScale;
        this.setFile(actualFile);
        tileMap.updateScale(newScale);
        tileMap.updateSet();
        grid.updateScale(newScale);
    }
}

Ausführende Klasse:
Code:
public EditMapTab(JPanel callingReference) {
        initToolBar();

        layerPanel.setPreferredSize(new Dimension(LEFT_SCROLLPANE_VP_WIDTH, LEFT_SCROLLPANE_VP_HEIGHT));
        layerPanel.setOpaque(false);
        
        leftScrollPane = new JScrollPane(layerPanel, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);  
        leftScrollPane.setPreferredSize(new Dimension(LEFT_SCROLLPANE_VP_WIDTH + 20, LEFT_SCROLLPANE_VP_HEIGHT + 18));
        leftScrollPane.getViewport().setOpaque(false);
        leftScrollPane.setOpaque(false);
        
        bkgPanel.setLayout(new BorderLayout());
        bkgPanel.add(leftScrollPane);
        
        loadTilesetBtn.setPreferredSize(new Dimension(112, 24));
        loadTilesetBtn.setLocation(22, 510);
        loadTilesetBtn.addActionListener(this);
        loadTilesetBtn.setVisible(true);
        
        closeTilesetBtn.setSize(112, 24);
        closeTilesetBtn.setLocation(158, 510);
        closeTilesetBtn.addActionListener(this);
        closeTilesetBtn.setVisible(true);
        
        leftFramePanel.setSize(256+16+20, 480+24+40);
        leftFramePanel.setLocation(16, 48);
        leftFramePanel.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), "TileViewer"));
        leftFramePanel.add(leftScrollPane);
        leftFramePanel.add(bkgPanel);
        leftFramePanel.add(loadTilesetBtn);
        leftFramePanel.add(closeTilesetBtn);
        leftFramePanel.setVisible(true);
        
        callingReference.add(leftFramePanel);
        callingReference.add(toolbar);
    }
 
S

SlaterB

Gast
mir fällt dazu nix ein,
bei einem kompletten Programm ließe sich natürlich alles kinderleicht korrigieren

falls du das posten magst, dann aber möglichst einfach,
Image painten sollte vielleicht drin sein,
aber ob ein Interface ScaleUpdating mit dem Problem zu tun hat, wage ich zu bezweifeln..
 
G

Gast

Gast
Okay, i did it!
Es fehlte noch für bkgPanel die Methode setPreferredSize().
Die brauchtest du natürlich bei deinen Grafikprimitiven nicht :)
Damit ist das Problem vom Tisch.
Danke für die Hilfe ^^
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
E JScrollPane mit JPanel verbinden AWT, Swing, JavaFX & SWT 1
O Swing "Eigenes" JPanel wird dem JScrollPane nicht hinzugefügt AWT, Swing, JavaFX & SWT 5
M Swing JPanel in JScrollPane AWT, Swing, JavaFX & SWT 3
A JScrollPane soll JPanel mit JButtons enthalten und eine Scollbar anzeigen AWT, Swing, JavaFX & SWT 1
W Swing Größenänderung vom JPanel im JScrollPane und anschließendes positionieren AWT, Swing, JavaFX & SWT 2
R JScrollPane überdeckt JPanel? AWT, Swing, JavaFX & SWT 7
H JTree in JScrollPane passt sich nicht an Größe von JPanel an AWT, Swing, JavaFX & SWT 2
M Mehrere Jpanel in einem JScrollPane (Layout) AWT, Swing, JavaFX & SWT 2
I JPanel in JScrollPane verkleinert sich leider nicht .... AWT, Swing, JavaFX & SWT 2
J Swing JTextPane mit JScrollPane auf JPanel scrollen nicht AWT, Swing, JavaFX & SWT 6
B Swing JPanel in JScrollPane einfügen AWT, Swing, JavaFX & SWT 2
S 3D-Grafik 3d Grafik auf einem JPanel oder im JScrollPane AWT, Swing, JavaFX & SWT 1
J Bilder auf JPanel (im JScrollPane) nacheinander laden AWT, Swing, JavaFX & SWT 0
T Swing JScrollPane in JPanel - Breite dynamisch, Höhe fix - wie? AWT, Swing, JavaFX & SWT 2
G JScrollPane reagiert nicht auf Änderung der JPanel-Größe AWT, Swing, JavaFX & SWT 4
C jPanel auf jScrollPane zentrieren AWT, Swing, JavaFX & SWT 3
S JScrollpane mit JPanel und Probleme AWT, Swing, JavaFX & SWT 4
T Swing JPanel in JScrollPane mit maximaler Größe AWT, Swing, JavaFX & SWT 8
R JPanel von JScrollPane entfernen und hinzufügen AWT, Swing, JavaFX & SWT 3
G mehrere JPanel in ein (vertikales) JScrollPane AWT, Swing, JavaFX & SWT 8
K JScrollPane IN JPanel? AWT, Swing, JavaFX & SWT 2
S Swing Problem mit JCheckBox auf JPanel in JScrollPane AWT, Swing, JavaFX & SWT 8
F JScrollPane verwirft Layout von JPanel AWT, Swing, JavaFX & SWT 2
X Swing JScrollPane und JPanel AWT, Swing, JavaFX & SWT 3
C JPanel mit FlowLayout in JScrollPane - keinen Scrollbalken AWT, Swing, JavaFX & SWT 2
G Swing JScrollPane auf JPanel AWT, Swing, JavaFX & SWT 3
B JPanel zu groß in JScrollPane AWT, Swing, JavaFX & SWT 5
H Swing JScrollPane mit JPanel als View AWT, Swing, JavaFX & SWT 3
J Swing JScrollPane fasst JPanel und Groesse des JPanels soll sich aendern AWT, Swing, JavaFX & SWT 2
J Swing JScrollPane nimmt das JPanel zum Zeichnen nicht an AWT, Swing, JavaFX & SWT 5
A Swing Zeilenanzeige: JPanel als Header für JScrollPane AWT, Swing, JavaFX & SWT 7
H Swing Darstellungsproblem JPanel in JPanel in JScrollpane in JSplitPane AWT, Swing, JavaFX & SWT 4
MQue JPanel und JScrollPane AWT, Swing, JavaFX & SWT 8
S JPanel-Dim reicht nicht aus, JScrollPane AWT, Swing, JavaFX & SWT 8
R JPanel in JScrollPane - zeichnen der Mausposition AWT, Swing, JavaFX & SWT 3
R JPanel in JScrollPane neu zeichnen AWT, Swing, JavaFX & SWT 7
B Anfängerfrage zu Swing (JPanel und JScrollPane) AWT, Swing, JavaFX & SWT 16
J JPanel mit JScrollPane und FlowLayut AWT, Swing, JavaFX & SWT 3
N Mehrere JTextArea in einem JPanel und eine JScrollPane AWT, Swing, JavaFX & SWT 3
C JScrollPane ignoriert JPanel mit überschriebener pai.nt() AWT, Swing, JavaFX & SWT 11
F JScrollPane mit JPanel drinne zeigt keine Scroll-Leisten AWT, Swing, JavaFX & SWT 7
W JPanel in JScrollPane? AWT, Swing, JavaFX & SWT 2
M JPanel JTable in einem JScrollPane AWT, Swing, JavaFX & SWT 6
M JScrollPane im JPanel im JFrame SWING AWT, Swing, JavaFX & SWT 4
S JPanel in JScrollPane AWT, Swing, JavaFX & SWT 11
P JPanel in JScrollPane -> funktioniert nicht(vertikal scro AWT, Swing, JavaFX & SWT 5
S JScrollPane > JPanel - automatisch scrollen AWT, Swing, JavaFX & SWT 2
T Automatische Grössenanpassung JPanel / JScrollpane AWT, Swing, JavaFX & SWT 3
B JPanel in JScrollPane: Probleme mit Scrollleisten AWT, Swing, JavaFX & SWT 13
R JPanel eingebettet in einem JScrollPane AWT, Swing, JavaFX & SWT 3
M JScrollPane auf JPanel - Resizing - Größe verändern AWT, Swing, JavaFX & SWT 10
O JScrollPane beinhaltet JPanel mit null Layout kein Scrollen AWT, Swing, JavaFX & SWT 3
J JPanel in JScrollPane Hilfe bitte AWT, Swing, JavaFX & SWT 2
S JPanel in JScrollPane in der Breite begrenzen AWT, Swing, JavaFX & SWT 3
S Größe von jPanel bzw. jTextArea (in jScrollpane) anpassen AWT, Swing, JavaFX & SWT 1
B Schachtelung von JTable und JScrollpane in JPanel? AWT, Swing, JavaFX & SWT 2
N Probleme mit new JScrollPane(jPanel) AWT, Swing, JavaFX & SWT 6
P Zwei JPanel übereianderlegen AWT, Swing, JavaFX & SWT 14
XWing Basic JPanel mit 2 Buttons beutzen. AWT, Swing, JavaFX & SWT 10
G JPanel per Drag and Drop JButtons und Bilder ablegen AWT, Swing, JavaFX & SWT 1
G JPanel mit JButtons und Bilder AWT, Swing, JavaFX & SWT 5
N AWT JPanel zu Jframe hinzufügen AWT, Swing, JavaFX & SWT 2
M clear JPanel before repainting AWT, Swing, JavaFX & SWT 1
B ImageIcon auf JPanel austauschen AWT, Swing, JavaFX & SWT 3
T Swing Reload JPanel + darin liegende ProgressBar AWT, Swing, JavaFX & SWT 9
P Swing Mehrere JLabels mit ImageIcon in JPanel lesen AWT, Swing, JavaFX & SWT 1
F JPanel Celleditor AWT, Swing, JavaFX & SWT 8
B JPanel-Inhalte inkl. JTextarea zoomen? AWT, Swing, JavaFX & SWT 3
B Mit ContentPane werden Komponenten angezeigt, mit SplitPane, JPanel nicht? AWT, Swing, JavaFX & SWT 6
CptK Funktionsgraphen effizient zeichnen und nur Teile von JPanel erneuern AWT, Swing, JavaFX & SWT 2
P Button simpler random auf einem JPanel verteilen? AWT, Swing, JavaFX & SWT 3
Ich lerne Java. Swing Von JPanel A auf JPanel B zugreifen. AWT, Swing, JavaFX & SWT 4
A JPanel austauschen und Focus geben AWT, Swing, JavaFX & SWT 3
E Auf JPanel malen und davor JComponenten anzeigen AWT, Swing, JavaFX & SWT 12
L JComponent aus JPanel anhand Mausposition ermitteln AWT, Swing, JavaFX & SWT 10
J JPanel wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
B Verschiebbares JPanel "ruckelt" im Randbereich AWT, Swing, JavaFX & SWT 2
S Swing JPanel nimmt keinen KeyListener an AWT, Swing, JavaFX & SWT 7
K JLabel mit Bilder im nicht initialisierten JPanel hinzufügen AWT, Swing, JavaFX & SWT 5
Hatsi09 Swing JPanel Bild einfügen AWT, Swing, JavaFX & SWT 14
L JPanel zeigt keinen Inhalt AWT, Swing, JavaFX & SWT 1
dereki2000 JPanel mit Rückgbe wie bei JOptionPane AWT, Swing, JavaFX & SWT 3
E Hintergrundfarbe setzen in JPanel funktioneirt nicht AWT, Swing, JavaFX & SWT 4
P JPanel KeyListener hinzufügen AWT, Swing, JavaFX & SWT 8
S Nach scrollen verschwindet das zuvor im JPanel gezeichnete AWT, Swing, JavaFX & SWT 2
P Bewegung eines Balkens in eineum JPanel welches als Spielfeld fungiert AWT, Swing, JavaFX & SWT 2
L Swing JPanel Größe anpassen AWT, Swing, JavaFX & SWT 6
D Platzierung von JTextfield in JPanel AWT, Swing, JavaFX & SWT 3
D Swing Anwendung ohne JPanel erstellen AWT, Swing, JavaFX & SWT 1
M Zwei JPanel übereinander nur vorderes "repainten" AWT, Swing, JavaFX & SWT 3
J 2D-Grafik Background einer Jpanel Klasse ändern AWT, Swing, JavaFX & SWT 1
J Ziehen eines Buttons im JPanel AWT, Swing, JavaFX & SWT 2
J Button lässt sich nicht auf dem JPanel verschieben AWT, Swing, JavaFX & SWT 5
D zwei JLabel stapeln in einem JPanel AWT, Swing, JavaFX & SWT 5
DaCrazyJavaExpert Swing JPanel "ContentPane" wird nicht gesetzt/angezeigt AWT, Swing, JavaFX & SWT 16
DaCrazyJavaExpert Swing Größe des JPanel ändern/wird nicht geändert. AWT, Swing, JavaFX & SWT 3
DaCrazyJavaExpert Swing JPanel wird in JScollPane nicht angezeigt AWT, Swing, JavaFX & SWT 2
it_is_all JPanel verschwindet nach Button-Klick AWT, Swing, JavaFX & SWT 2
B Bar Plot in Swing JPanel AWT, Swing, JavaFX & SWT 0
F Screenshot eines JPanel AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben