JScroolBar richtig benutzen

TheSorm

Bekanntes Mitglied
ch habe einen kleinen Lvl editor Programiert, da das Lvl aber sehr breit ist muss man es eig mit scrool bar verschieben können um das ganze lvl bearbeiten zu können. Ich würde gerne wissen wie ich das am besten amche, alles was bis jetzt mit der JScroolBar und dem AdjustmentListener gemacht wurde kann, ist es warscheinlich auch, falsch sein! Nach fehlenden infos bitte Fragen


Java:
 package main;
     
    import java.io.File;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.util.ArrayList;
     
    import javax.swing.JComboBox;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JMenu;
    import javax.swing.JMenuBar;
    import javax.swing.JMenuItem;
    import javax.swing.JOptionPane;
    import javax.swing.JScrollBar;
     
    import java.awt.Graphics;
    import java.awt.Scrollbar;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.AdjustmentEvent;
    import java.awt.event.AdjustmentListener;
    import java.awt.event.ItemEvent;
    import java.awt.event.ItemListener;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
     
    public class Frame extends JFrame {
       
        background bg;
        paint screen;
        JMenuBar bar;
        JMenu file;
        JMenuItem item;
        JMenuItem save;
        JScrollBar jScrollBar1;
        JComboBox<String> skin;
        String[] blockString = {"Boden", "Pipe", "Sky", "Player"};
        String name;
       
        private FileWriter writer;
       
        private int skinSelection;
        private int x;
        private int y;
       
        File doco;
        ArrayList<Character> mapLetters;
        ArrayList<background> bgArray;
        ArrayList<background> bgFinish;
     
       
        public Frame(background bg) {
            super("LvlEditor");
            this.bg = bg;
           
            x = 0;
            y = 0;
           
            bgFinish = new ArrayList<background>();
            mapLetters = new ArrayList<Character>();
            bgArray = new ArrayList<background>();
           
            screen = new paint();
           
            for(int ii = 0; ii < bg.getBoxLength(); ii++){
                char nicht = 'S' ;
                mapLetters.add(nicht);
            }
            for(int i = 0; i < bg.getBoxLength();i++){
                if(x >= 12800){
                    y += 64;
                    x = 0;
                }
                this.bg = new background(x, y, 0);
                bgArray.add(this.bg);
                x += 64;
                System.out.println("y="+y/64+", x="+x/64);
            }
           
            skin = new JComboBox<String>(blockString);
            bar = new JMenuBar();
            file = new  JMenu("File");
            item = new JMenuItem("New");
            save = new JMenuItem("Save");
            jScrollBar1 = new JScrollBar();
           
            screen.setBounds(512, 64, 1024, 768);
            skin.setBounds(10, 50, 120, 50);
            jScrollBar1.setBounds(0, 750, 1024, 17);
            jScrollBar1.setOrientation(Scrollbar.HORIZONTAL);
           
            screen.addMouseListener(new mouseListener());
            skin.addItemListener(new itemListener());
            item.addActionListener(new actionListener());
            save.addActionListener(new actionListener());
            jScrollBar1.addAdjustmentListener(new adjustmentListener());
           
            bar.add(file);
            file.add(item);
            file.add(save);
            setJMenuBar(bar);
            add(skin);
            add(screen);
            screen.add(jScrollBar1);
           
        }
       
     
     
        private class actionListener implements ActionListener {
           
            @Override
            public void actionPerformed(ActionEvent e) {
                if(e.getSource() == item){
                name = JOptionPane.showInputDialog(getParent(), "Name der File", "File", JOptionPane.OK_OPTION);
                doco = new File(name+".txt");
                try {
                    doco.createNewFile();
                    writer = new FileWriter(name+ ".txt");
                }catch (IOException e1) {e1.printStackTrace();}
            }
            if(e.getSource() == save ){
                for(int i = 0; i < bg.getBoxLength(); i++){
                    try {
                        writer.write(mapLetters.get(i));
                        writer.flush();
                    } catch (IOException e1) {e1.printStackTrace();}
                }
                try {
                    writer.close();
                } catch (IOException e1) {e1.printStackTrace();}
            }
        }
    }
       
        private class adjustmentListener implements AdjustmentListener {
           
            @Override
            public void adjustmentPerformed(AdjustmentEvent e) {
                if(e.getValue()==10){
                    System.out.println("gut");
                }
           
        }
     
    }
       
        private class itemListener implements ItemListener {
           
            @Override
            public void itemStateChanged(ItemEvent e) {
                if(e.getStateChange() == e.SELECTED){
                    if(e.getSource() == skin) {
                                skinSelection = skin.getSelectedIndex();
                    }
                }
            }
        }
       
        private class mouseListener implements MouseListener{
            @Override
            public void mouseClicked(MouseEvent e) {
                for(int i = 0; i < bgArray.size();i++) {
                    if(e.getX() >= bgArray.get(i).getBounding().x && e.getX() <= bgArray.get(i).getBounding().x+64 && e.getY() >= bgArray.get(i).getBounding().y && e.getY() <= bgArray.get(i).getBounding().y+64){
                        bg = new background(bgArray.get(i).getBounding().x, bgArray.get(i).getBounding().y, skinSelection);
                        bgFinish.add(bg);
                        if(skinSelection == 0){
                            mapLetters.remove(i);
                            mapLetters.add(i,'G');
                        }
                        else if(skinSelection == 1){
                            mapLetters.remove(i);
                            mapLetters.add(i,'P');
                        }
                        else if(skinSelection == 2){
                            mapLetters.remove(i);
                            mapLetters.add(i,'S');
                        }
                        else if(skinSelection == 3){
                            mapLetters.remove(i);
                            mapLetters.add(i,'$');
                        }
                        System.out.println(i);
                }
            }
        }
       
       
        @Override
        public void mouseEntered(MouseEvent e){}
       
        @Override
        public void mouseExited(MouseEvent e){}
       
        @Override
        public void mousePressed(MouseEvent e){}
           
        @Override
        public void mouseReleased(MouseEvent e){}
       
        }
       
        private class paint extends JLabel{
            protected void paintComponent(Graphics g){
            for(int i = 0; i < bgArray.size();i++) {
                g.drawRect(bgArray.get(i).getBounding().x, bgArray.get(i).getBounding().y, bgArray.get(i).getBounding().width, bgArray.get(i).getBounding().height);
                }
            for(int ii = 0; ii < bgFinish.size();ii++){
                g.drawImage(bgFinish.get(ii).getImage(), bgFinish.get(ii).getBounding().x,bgFinish.get(ii).getBounding().y, null );
            }
            }
            }
    public void repaintScreen() {
        screen.repaint();
    }
    }
 
Hey,

versuch mal den ganzen Content ( die Oberfläche, die gescrollt werden soll ) in ein JPanel hinzuzufügen.
Danach kannst du normalerweise die JScrollBar so aktivieren:

Java:
panel.add( scrollbar( zuScrollenderInhalt) );

Ich hoffe ich habe verstanden, was du wolltest 😀
 
also wie man siht ist screen sehr breit weil das Lvl sehr viele blücke in der breite ist das fenster kann ja aber höchstens ca.1920x1080 p haben. Ich möchte jetzt das ich in screen rum scroolen kann aber wenn ich das mache wie es im tutorial stand wird bei mir kein scrool Balken angezeigt. Bitte um Hilfe!

Java:
package main;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;

import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Scrollbar;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.AdjustmentEvent;
import java.awt.event.AdjustmentListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

public class Frame extends JFrame {
	
	background bg;
	paint screen;
	JMenuBar bar;
	JMenu file;
	JMenuItem item;
	JMenuItem save; 
	JScrollPane scrollPane;
	JComboBox<String> skin;
	String[] blockString = {"Boden", "Pipe", "Sky", "Player"};
	String name;
	
	private FileWriter writer;
	
	private int skinSelection;
	private int x;
	private int y;
	
	File doco;
	ArrayList<Character> mapLetters;
	ArrayList<background> bgArray;
	ArrayList<background> bgFinish;

	
	public Frame(background bg) {
		super("LvlEditor");
		this.bg = bg;
		
		x = 0;
		y = 0;
		
		bgFinish = new ArrayList<background>();
		mapLetters = new ArrayList<Character>();
		bgArray = new ArrayList<background>();
		
		screen = new paint();
		
		for(int ii = 0; ii < bg.getBoxLength(); ii++){
			char nicht = 'S' ;
			mapLetters.add(nicht);
		}
		for(int i = 0; i < bg.getBoxLength();i++){
			if(x >= 12800){
				y += 64;
				x = 0;
			}
			this.bg = new background(x, y, 0);
			bgArray.add(this.bg);
			x += 64;
			System.out.println("y="+y/64+", x="+x/64);
		}
		
		skin = new JComboBox<String>(blockString);
		bar = new JMenuBar();
		file = new  JMenu("File");
		item = new JMenuItem("New");
		save = new JMenuItem("Save");
		scrollPane = new JScrollPane(screen);
		
		screen.setBounds(140, 64, 12800, 768);
		skin.setBounds(10, 50, 120, 50);
		scrollPane.setPreferredSize(new Dimension(1500, 1100));
		
		screen.addMouseListener(new mouseListener());
		skin.addItemListener(new itemListener());
		item.addActionListener(new actionListener());
		save.addActionListener(new actionListener());
		
		bar.add(file);
		file.add(item);
		file.add(save);
		setJMenuBar(bar);
		add(skin);
		add(screen);
		add(scrollPane, BorderLayout.CENTER);
		
	}
	


	private class actionListener implements ActionListener {
		
		@Override
		public void actionPerformed(ActionEvent e) {
			if(e.getSource() == item){
			name = JOptionPane.showInputDialog(getParent(), "Name der File", "File", JOptionPane.OK_OPTION);
			doco = new File(name+".txt");
			try {
				doco.createNewFile();
				writer = new FileWriter(name+ ".txt");
			}catch (IOException e1) {e1.printStackTrace();}
		}
		if(e.getSource() == save ){
			for(int i = 0; i < bg.getBoxLength(); i++){
				try {
					writer.write(mapLetters.get(i));
					writer.flush();
				} catch (IOException e1) {e1.printStackTrace();}
			}
			try {
				writer.close();
			} catch (IOException e1) {e1.printStackTrace();}
		}
	}
}
	
	
	private class itemListener implements ItemListener {
		
		@Override
		public void itemStateChanged(ItemEvent e) {
			if(e.getStateChange() == e.SELECTED){
				if(e.getSource() == skin) {
							skinSelection = skin.getSelectedIndex();
				}
			}
		}
	}
	
	private class mouseListener implements MouseListener{
		@Override
		public void mouseClicked(MouseEvent e) {
			for(int i = 0; i < bgArray.size();i++) {
				if(e.getX() >= bgArray.get(i).getBounding().x && e.getX() <= bgArray.get(i).getBounding().x+64 && e.getY() >= bgArray.get(i).getBounding().y && e.getY() <= bgArray.get(i).getBounding().y+64){
					bg = new background(bgArray.get(i).getBounding().x, bgArray.get(i).getBounding().y, skinSelection);
					bgFinish.add(bg);
					if(skinSelection == 0){
						mapLetters.remove(i);
						mapLetters.add(i,'G');
					}
					else if(skinSelection == 1){
						mapLetters.remove(i);
						mapLetters.add(i,'P');
					}
					else if(skinSelection == 2){
						mapLetters.remove(i);
						mapLetters.add(i,'S');
					}
					else if(skinSelection == 3){
						mapLetters.remove(i);
						mapLetters.add(i,'$');
					}
					System.out.println(i);
			}
		}
	}
	
	
	@Override
	public void mouseEntered(MouseEvent e){}
	
	@Override
	public void mouseExited(MouseEvent e){}
	
	@Override
	public void mousePressed(MouseEvent e){}
		
	@Override
	public void mouseReleased(MouseEvent e){}
	
	}
	
	private class paint extends JLabel{
		protected void paintComponent(Graphics g){
		for(int i = 0; i < bgArray.size();i++) {
			g.drawRect(bgArray.get(i).getBounding().x, bgArray.get(i).getBounding().y, bgArray.get(i).getBounding().width, bgArray.get(i).getBounding().height);
			}
		for(int ii = 0; ii < bgFinish.size();ii++){
			g.drawImage(bgFinish.get(ii).getImage(), bgFinish.get(ii).getBounding().x,bgFinish.get(ii).getBounding().y, null );
		}
		}
		}
public void repaintScreen() {
	screen.repaint();
}
}
 
ich kann leider den Quelltext nicht bei mir in Eclipse importieren...
Wie gesagt, erstelle mal ein Panel, in den du die ganzen Swing Elemente reinlädst ( panel.add( Komponente ); ) , dann füge diesem Panel die Scrollbar hinzu.
So funktioniert das bei mir immer:
Java:
panel.add( scrollbar( zuScrollenderInhalt) );

2. Idee:
Du erstellst 2 Panel, in dem einen Panel lädst du den ganzen Inhalt rein und im 2. Panel fügst du den 1. Panel hinzu mit der Scrollbar:
Java:
panel2.add( scrollbar( panel1 ) );

Das sollte funktionieren
 
Ich will es jetzt mit scrollPane machen denke das ist einfacher, auch wenn es nicht funktionirt. Also kann mir da jemand auf den quelltext bezogen helfen? In der Classe background werden an sich nur Bilder eingelesen, und in Main nur die Objekte erzeugt von background und Frame und die standart sachen zu Frame hinzugefügt!
 
Also so funktionirt es richtig! aber geht das noch eleganter hab jetzt viel mit ausprobieren gemacht, zb die richtigen Prefereds?

Java:
package main;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;

import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.ScrollPaneConstants;

import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Panel;
import java.awt.Scrollbar;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.AdjustmentEvent;
import java.awt.event.AdjustmentListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

public class Frame {
	
	public JFrame frame;
	
	background bg;
	paint screen;
	JMenuBar bar;
	JMenu file;
	JMenuItem item;
	JMenuItem save; 
	JScrollPane scrollPane;
	JComboBox<String> skin;
	String[] blockString = {"Boden", "Pipe", "Sky", "Player"};
	String name;
	
	private FileWriter writer;
	
	private int skinSelection;
	private int x;
	private int y;
	
	File doco;
	
	ArrayList<Character> mapLetters;
	ArrayList<background> bgArray;
	ArrayList<background> bgFinish;

	
	public Frame(background bg) {
		frame = new JFrame("Level editor");
		this.bg = bg;
		x = 0;
		y = 0;
		
		bgFinish = new ArrayList<background>();
		mapLetters = new ArrayList<Character>();
		bgArray = new ArrayList<background>();
		
		screen = new paint();
		
		for(int ii = 0; ii < bg.getBoxLength(); ii++){
			char nicht = 'S' ;
			mapLetters.add(nicht);
		}
		for(int i = 0; i < bg.getBoxLength();i++){
			if(x >= 12800){
				y += 64;
				x = 0;
			}
			this.bg = new background(x, y, 0);
			bgArray.add(this.bg);
			x += 64;
			System.out.println("y="+y/64+", x="+x/64);
		}
		
		skin = new JComboBox<String>(blockString);
		bar = new JMenuBar();
		file = new  JMenu("File");
		item = new JMenuItem("New");
		save = new JMenuItem("Save");
		
		skin.setBounds(1550, 50, 120, 50);
		screen.setBounds(140, 64, 12800, 768);
		screen.setPreferredSize(new Dimension(12800, 768));
		
		scrollPane = new JScrollPane(screen,ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS,ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS);
		scrollPane.setPreferredSize(new Dimension(1500, 950));
		
		screen.addMouseListener(new mouseListener());
		skin.addItemListener(new itemListener());
		item.addActionListener(new actionListener());
		save.addActionListener(new actionListener());

		bar.add(file);
		file.add(item);
		file.add(save);
		frame.setJMenuBar(bar);
		frame.add(skin);
		frame.add(scrollPane);
		frame.pack();
	}
	


	private class actionListener implements ActionListener {
		
		@Override
		public void actionPerformed(ActionEvent e) {
			if(e.getSource() == item){
			name = JOptionPane.showInputDialog(frame, "Name der File", "File", JOptionPane.OK_OPTION);
			doco = new File(name+".txt");
			try {
				doco.createNewFile();
				writer = new FileWriter(name+ ".txt");
			}catch (IOException e1) {e1.printStackTrace();}
		}
		if(e.getSource() == save ){
			for(int i = 0; i < bg.getBoxLength(); i++){
				try {
					writer.write(mapLetters.get(i));
					writer.flush();
				} catch (IOException e1) {e1.printStackTrace();}
			}
			try {
				System.out.println("Datei Gespeichert");
				writer.close();
			} catch (IOException e1) {e1.printStackTrace();}
		}
	}
}
	
	
	private class itemListener implements ItemListener {
		
		@Override
		public void itemStateChanged(ItemEvent e) {
			if(e.getStateChange() == e.SELECTED){
				if(e.getSource() == skin) {
							skinSelection = skin.getSelectedIndex();
				}
			}
		}
	}
	
	private class mouseListener implements MouseListener{
		@Override
		public void mouseClicked(MouseEvent e) {}

		@Override
		public void mouseEntered(MouseEvent e){}
	
		@Override
		public void mouseExited(MouseEvent e){}
	
		@Override
		public void mousePressed(MouseEvent e){}
		
		@Override
		public void mouseReleased(MouseEvent e){			
			for(int i = 0; i < bgArray.size();i++) {
				if(e.getX() >= bgArray.get(i).getBounding().x && e.getX() <= bgArray.get(i).getBounding().x+64 && e.getY() >= bgArray.get(i).getBounding().y && e.getY() <= bgArray.get(i).getBounding().y+64){
					bg = new background(bgArray.get(i).getBounding().x, bgArray.get(i).getBounding().y, skinSelection);
					bgFinish.add(bg);
					if(skinSelection == 0){
						mapLetters.remove(i);
						mapLetters.add(i,'G');
					}
					else if(skinSelection == 1){
						mapLetters.remove(i);
						mapLetters.add(i,'P');
					}
					else if(skinSelection == 2){
						mapLetters.remove(i);
						mapLetters.add(i,'S');
					}
					else if(skinSelection == 3){
						mapLetters.remove(i);
						mapLetters.add(i,'$');
					}
					System.out.println(i);
				}
			}
		}
	}
	
	private class paint extends JLabel{
		
		protected void paintComponent(Graphics g){
			for(int i = 0; i < bgArray.size();i++) {
				g.drawRect(bgArray.get(i).getBounding().x, bgArray.get(i).getBounding().y, bgArray.get(i).getBounding().width, bgArray.get(i).getBounding().height);
			}
			for(int ii = 0; ii < bgFinish.size();ii++){
				g.drawImage(bgFinish.get(ii).getImage(), bgFinish.get(ii).getBounding().x,bgFinish.get(ii).getBounding().y, null );
			}
			}
	}
	
	public void repaintScreen() {
		screen.repaint();
	}
}
 

Neue Themen


Zurück
Oben