Jump to content



Βοήθεια με την χρήση του Imgscalr, Listeners και ότι άλλο προκύψει


Recommended Posts

Πως πιστεύετε ότι είναι καλύτερα να υλοποιήσω το παρακάτω;

 

Θα έχω διάφορες κλάσεις και κάποιες απ αυτές θα έχουν GUI (JPanel, JFrame κλπ).

Σε κάθε κλάση να βάζω main και ανάλογα το ποια θέλω εμφανίζω να την κάνω show/hide ή μια main κλάση που θα κάνει αυτή τη δουλειά;

 

Βασικά ποιος είναι ο καλύτερος τρόπος να παίξω με την εναλλαγή παραθύρων; 

Link to comment
Share on other sites

Μπορεί να με βοηθήσει κάποιος με το πως θα έχω adaptive jpanels ανάλογα με το μέγεθος του main JFrame για να μην έχω το παρακάτω;

Spoiler

0ca4d87c66e64a1dbd7f560d5094979f.jpeg

Η κάτι πιο απλό που νομίζω θα δουλέψει. Αντί να βάλω setSize(x, x), πως μπορώ να ορίσω το Jpanel2 έστω να έχει το 1/3 του πλάτους του παραθύρου;

Link to comment
Share on other sites

Βάλε το JFrame να έχει κάποιο layout π.χ BorderLayout.

 

 

MainPanel panel = new MainPanel();
JFrame frame = new JFrame();
frame.setLayout(new BorderLayout());
frame.add(panel, BorderLayout.CENTER);
frame.pack();
frame.setVisible(true);

 

Σχετικά με το

BufferedImage img = ImageIO.read(getClass().getResource("src/icons/snakes_ladders.png"));

 

Το getClass().getResource(...) το path είναι σχετικό με το που είναι η class σου.

Έτσι όπως το έχεις είναι σαν να λες ότι έχεις το αρχείο main.java σε ενα package π.χ com.example.mypackage και μέσα στο package έχεις το αρχείο snakes_ladders.png μέσα στο φάκελο src/icons.

 

Αν το είχες έτσι, άπλα θα το φόρτωνε χωρίς πρόβλημα. Κατά πάσα πιθανότητα το έχεις έξω από το package όποτε  το φορτώνεις έτσι

 

BufferedImage img = ImageIO.read(getClass().getResource("../src/icons/snakes_ladders.png"));

 

  • Like 1
Link to comment
Share on other sites

Νομίζω το δεύτερο θα λειτουργήσει γιατί τα icons τα έχω σε δικό τους package, οπότε ναι, θα έπρεπε να πάω ένα φάκελο πίσω απ ότι είναι η main.

Τόσο απλό αλλά ούτε καν μου πέρασε απ το μυαλό.. :mellow:

 

Θα δοκιμάσω και με το Layout αν και απ ότι θυμάμαι πρέπει να του έχω κάποιο layout.

Ευχαριστώ!

 

Edit: Δουλεύει τελικά απλά χωρίς το src, δηλαδή:

BufferedImage img = ImageIO.read(getClass().getResource("../icons/snakes_ladders.png"));

 

Έγινε επεξεργασία από UltraB
Link to comment
Share on other sites

On 4/18/2017 at 10:54 ΜΜ, το μέλος defiant έγραψε:

Βάλε το JFrame να έχει κάποιο layout π.χ BorderLayout.


MainPanel panel = new MainPanel();
JFrame frame = new JFrame();
frame.setLayout(new BorderLayout());
frame.add(panel, BorderLayout.CENTER);
frame.pack();
frame.setVisible(true);

Να ρωτήσω, αυτό τι απ όλα αφορούσε; Το παραπάνω μήνυμα απ την απάντηση σου (post #25);

Αν ναι, γίνεται χωρίς την χρήση JFrame; 

 

Με έχει βολέψει (προς το παρόν τουλάχιστον) να έχω ένα JFrame μόνο στη main και απλά να κάνω show/hide τα Panels (aka gui class files) που θέλω.

Link to comment
Share on other sites

Το layout σε βοηθάει στο να τοποθετήσεις τα panel. Για να έχεις το 1/3 του frame size εγώ θα χρησιμοποιούσα το setPreferedSize να είναι το Width/3 και το height το ίδιο.

Αν θες αυτό να αλλάζει δυναμικά οταν κανεις resize ή maximize βαλε ενα event listener οπου θα ξαναυπολογιζει τις νεες διαστάσεις.

 

Π.χ

 

		JFrame frame;
		frame = new JFrame();
		frame.setSize(new Dimension(500, 400));
		frame.setBounds(100, 100, 500, 400);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		JPanel panel = new JPanel();
		panel.setBackground(Color.YELLOW);
		panel.setPreferredSize(new Dimension(frame.getWidth()/3, frame.getHeight()));
		frame.getContentPane().add(panel, BorderLayout.WEST);
		
		frame.addWindowStateListener(new WindowStateListener() {
			public void windowStateChanged(WindowEvent e) {
				panel.setPreferredSize(new Dimension(frame.getWidth()/3, frame.getHeight()));
			}
		});
		frame.addComponentListener(new ComponentAdapter() {
			@Override
			public void componentResized(ComponentEvent e) {
				panel.setPreferredSize(new Dimension(frame.getWidth()/3, frame.getHeight()));
			}
		});

 

Link to comment
Share on other sites

Να προσθέσω κάτι απλό που έκανα, που αν μπορώ να το τροποποιήσω θα είναι το ιδανικό;

setLayout(new BorderLayout());
add(leftPanel, BorderLayout.CENTER);
add(rightPanel, BorderLayout.LINE_END);
Spoiler

74aeaaa83f1e4a0ea127bda061f5c989.jpeg

Αν μπορώ να καθορίσω κάπως το μέγεθος τους ώστε να μην καθορίζεται από τα περιεχόμενα των JPanel νομίζω μου αρκεί και κάνει την δουλειά που θέλω, συν ότι είναι responsive.

 

Edit: Τώρα είδα ότι και το δικό σου με παρόμοιο τρόπο είναι. Δοκιμάζω να παίξω λίγο με το setPreferredSize μήπως κάνω δουλειά.

Link to comment
Share on other sites

Έβαλα leftPanel.setPreferredSize(new Dimension(800, 800)); και φαίνεται να λειτουργεί μια χαρά.

 

Να ρωτήσω κάτι άλλο. Ποιος είναι ο καλύτερος τρόπος να παίρνω τιμές από άλλη κλάση;

Πχ ένα όνομα που δίνω στο αρχικό panel και θέλω να το χρησιμοποιώ και παρακάτω.

Link to comment
Share on other sites

Public είναι οι μεταβλητές αλλά δεν είναι γνωστές στην άλλη κλάση. Επίσης έχω και getters.

Επειδή όμως νομίζω ότι σε μπέρδεψα, εννοώ σε άλλο class αρχείο, όχι άλλη κλάση εντός του ίδιου αρχείου.

Link to comment
Share on other sites

Μήπως να έδινες κομμάτι του κώδικα επειδή δεν είναι σαφές αυτό που περιγράφεις;

Οι τρόποι γενικότερα που έχω δει/χρησιμοποιήσει είναι α) static instance variables β) class με getters που όμως θέλει να δημιουργήσεις instance της class στην άλλη class

γ) singleton της κλασης που χρειαζεται να μοιραζεσαι τα instance methods/variable δ) observer pattern;

 

Το κυριοτερο ομως ειναι τι θελεις να κανεις και γιατι. Οποτε καλυτερα να βαλεις κωδικα.

Link to comment
Share on other sites

Τώρα κάνω αυτό:

Το IntroPanel είναι το όνομα ενός αρχείου .class και το getName το όνομα του getter του ονόματος.

IntroPanel intro = new IntroPanel();
playerName = intro.getName();

Είναι σωστό πέρα του ότι λειτουργεί ή υπάρχει κάποιος πιο αποδοτικός τρόπος;

Link to comment
Share on other sites

Λοιπόν, έχω ένα JPanel το οποίο περιέχει 100 κουμπιά (ίσως αλλάξουν σε JLabel στην πορεία, θα δείξει). 

 

Θέλω λοιπόν πάνω από το κουμπί να εμφανίζω μια εικόνα.

Πως μπορώ να κάνω κάτι τέτοιο;

Link to comment
Share on other sites

        JButton btnNewButton = new JButton("New button");
        try {
            Image img = ImageIO.read(getClass().getResource("image.jpg"));
            btnNewButton.setIcon(new ImageIcon(img));
        } catch (Exception e) {
            e.printStackTrace();
        }

 

Αν θες να κάνεις resize την εικόνα στις διαστάσεις του button χρησιμοποίησε την img.getScaledInstance

Link to comment
Share on other sites

 

πριν 5 ώρες, το μέλος UltraB έγραψε:

Λοιπόν, έχω ένα JPanel το οποίο περιέχει 100 κουμπιά (ίσως αλλάξουν σε JLabel στην πορεία, θα δείξει). 

 

Θέλω λοιπόν πάνω από το κουμπί να εμφανίζω μια εικόνα.

Πως μπορώ να κάνω κάτι τέτοιο;

Αφού δεν θες ακριβώς αυτό γιατί ρωτάς ακριβώς αυτό;:hmm:

Αυτό που ζητάς είναι ακριβώς αυτό, απλά θέλεις η εικόνα να είναι transparent.

Μετά βάζεις

btnNewButton.setContentAreaFilled(false);

και παίζεις και με

btnNewButton.setOpaque(false) και btnNewButton.setBorderPainted(false); αν θες να βγαλεις και το border

 

Έγινε επεξεργασία από defiant
Link to comment
Share on other sites

πριν 6 ώρες, το μέλος UltraB έγραψε:

Λοιπόν, έχω ένα JPanel το οποίο περιέχει 100 κουμπιά (ίσως αλλάξουν σε JLabel στην πορεία, θα δείξει). 

 

Θέλω λοιπόν πάνω από το κουμπί να εμφανίζω μια εικόνα.

Πως μπορώ να κάνω κάτι τέτοιο;

giphy.gif

 

Θα δοκιμάσω λίγο πάντως την δεύτερη ιδέα σου, ίσως με λίγη τροποποίηση να πετύχω αυτό που θέλω.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Δημιουργία...

Important Information

Ο ιστότοπος theLab.gr χρησιμοποιεί cookies για να διασφαλίσει την καλύτερη εμπειρία σας κατά την περιήγηση. Μπορείτε να προσαρμόσετε τις ρυθμίσεις των cookies σας , διαφορετικά θα υποθέσουμε ότι είστε εντάξει για να συνεχίσετε.