2015-05-15 36 views
6

Pracuję nad automatem w Javie i do tej pory stworzyłem przycisk, który losowo wygeneruje dwa obrazy. Mój kod się kompiluje, ale kiedy go uruchomię, wszystkie rzeczy, które umieściłem w metodzie malowania, nie pojawią się. Czy jest coś, czego mi brakuje? Dzięki za pomoc, a oto niektóre z mojego kodu.Jak używać metody malowania w JPanelu

public void paint(Graphics g) { 
     super.paintComponents(g); 
     g.drawString("Int 1 is" + int1,30,30); 
     g.drawString("Int 2 is" + int2,30,80); 
     switch (int1) { 
      case 0: 
       g.setColor(Color.white); 
       g.fillRect(300,300,300,500); 
       g.drawImage(img, 300, 500, this); 
       break; 
      case 1: 
       g.setColor(Color.white); 
       g.fillRect(300,300,300,500); 
       g.drawImage(img2,300,500,this); 
       break; 
      case 2: 
       g.setColor(Color.white); 
       g.fillRect(300,300,300,500); 
       g.drawImage(img3,300,500,this); 
       break; 
      case 3: 
       g.setColor(Color.white); 
       g.fillRect(300,300,300,500); 
       g.drawImage(img4,300,500,this); 
       break; 
      case 4: 
       g.setColor(Color.white); 
       g.fillRect(300,300,300,500); 
       g.drawImage(img5,300,500,this); 
       break; 
      case 5: 
       g.setColor(Color.white); 
       g.fillRect(300,300,300,500); 
       g.drawImage(img6,300,500,this); 
       break; 
      case 6: 
       g.setColor(Color.white); 
       g.fillRect(300,300,300,500); 
       g.drawImage(img7,300,500,this); 
       break; 
      case 7: 
       g.setColor(Color.white); 
       g.fillRect(300,300,300,500); 
       g.drawImage(img8,300,500,this); 
       break; 
      case 8: 
       g.setColor(Color.white); 
       g.fillRect(300,300,300,500); 
       g.drawImage(img9,300,500,this); 
       break; 
      case 9: 
       g.setColor(Color.white); 
       g.fillRect(300,300,300,500); 
       g.drawImage(img10,300,500,this); 
       break; 
     } 
     switch (int2) { 
      case 0: 
       g.setColor(Color.white); 
       g.fillRect(300,300,800,500); 
       g.drawImage(img, 800, 500, this); 
       break; 
      case 1: 
       g.setColor(Color.white); 
       g.fillRect(300,300,800,500); 
       g.drawImage(img2,800,500,this); 
       break; 
      case 2: 
       g.setColor(Color.white); 
       g.fillRect(300,300,800,500); 
       g.drawImage(img3,800,500,this); 
       break; 
      case 3: 
       g.setColor(Color.white); 
       g.fillRect(300,300,800,500); 
       g.drawImage(img4,800,500,this); 
       break; 
      case 4: 
       g.setColor(Color.white); 
       g.fillRect(300,300,800,500); 
       g.drawImage(img5,800,500,this); 
       break; 
      case 5: 
\    g.setColor(Color.white); 
       g.fillRect(300,300,800,500); 
       g.drawImage(img6,800,500,this); 
       break; 
      case 6: 
       g.setColor(Color.white); 
       g.fillRect(300,300,800,500); 
       g.drawImage(img7,800,500,this); 
       break; 
      case 7: 
       g.setColor(Color.white); 
       g.fillRect(300,300,800,500); 
       g.drawImage(img8,800,500,this); 
       break; 
      case 8: 
       g.setColor(Color.white); 
       g.fillRect(300,300,800,500); 
       g.drawImage(img9,800,500,this); 
       break; 
      case 9: 
       g.setColor(Color.white); 
       g.fillRect(300,300,800,500); 
       g.drawImage(img10,800,500,this); 
       break; 
     } 
     this.setVisible(true); 
    } 
+1

W przypadku 'Swinga' nie należy bawić się metodą 'farby' dla takiego zadania. Zamiast tego nadpisuj 'paintComponent (...)' metodę jakiegoś 'JComponent/JPanel', aby zrobić rzeczy związane z malowaniem. Więcej informacji na [Performing Custom Painting] (https://docs.oracle.com/javase/tutorial/uiswing/painting/). Czy przeczytać rozwiązywanie wspólnych problemów, pierwszy problem będzie odpowiedzieć na to, co robisz źle. Mam nadzieję, że to pomoże :-) –

+1

Yikes, twoja metoda 'paint' nazywa' super.paintComponents (...) 'bardzo niebezpieczną rzeczą do zrobienia.Proszę przeczytać tutoriale malarskie na ten temat, ponieważ wszystko to jest bardzo dobrze wyjaśnione i zgadza się dokładnie z tym, co @nIcEcOw stwierdza powyżej. Ja po prostu zamieniłbym ImageIcons wyświetlane w JLabel. –

+0

Zobacz edytuj, aby odpowiedzieć. –

Odpowiedz

4

Problemy:

  • pan rysunek bezpośrednio w JFrame - nie rób tego, jak można zepsuć grafiki JFrame.
  • Twoje przesłonięcie metody malowania i wywołanie metody super.paintComponents(...), znowu niebezpieczna rzecz do zrobienia i coś, co nigdy nie powinno być zrobione.

Zamiast tego mógłby ma swój rysunek w metodzie z JPanel paintComponent(...) i wywołać właściwą metodę super.paintComponent(...) wewnątrz niej, jak to opisano w Swing painting tutorials, ale po co się męczyć. Znacznie łatwiej byłoby stworzyć tablicę ImageIcons i po prostu wywołać setIcon(...) na 3 (lub jakkolwiek wielu potrzebujesz) JLabels, po losowym wybraniu ikony z tablicy lub tablicy ArrayList.

Również nigdy to zrobić:

try { 

    // .... some code here 

} catch (IOException e) { 

} 

Przynajmniej wydrukować ślad stosu w bloku catch, dzięki czemu można zidentyfikować żadnych wyjątków IO jeśli występują:

try { 

    // .... some code here 

} catch (IOException e) { 
    e.printStackTrace(); // ****** added ********  
} 

Dla Przykład: poniższy kod wyświetli następujący GUI:

enter image description here

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.image.BufferedImage; 
import java.io.IOException; 
import java.net.URL; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.Random; 

import javax.imageio.ImageIO; 
import javax.swing.*; 

@SuppressWarnings("serial") 
// extend JPanel, not JFrame as it gives the class more flexibility as to where to use 
public class ShowRandomImages extends JPanel { 
    // images from Andrew Thompson's example image page, 
    // http://stackoverflow.com/questions/19209650/example-images-for-code-and-mark-up-qas 
    private static final String IMAGE_SHEET_PATH = "http://i.stack.imgur.com/memI0.png"; 
    // how many JLabels to show in a row 
    private static final int LABEL_COUNT = 3; 
    // need to get subimages from image sheet. There are 6 columns in the sheet 
    private static final int IMAGE_COLUMNS = 6; 
    // array of JLabel 
    private JLabel[] labels = new JLabel[LABEL_COUNT]; 
    // hold all the images as ImageIcons read in 
    private List<Icon> imageIconList = new ArrayList<>(); 
    // to randomize the images 
    private Random random = new Random(); 

    // pass the ImageIcon List into this class 
    public ShowRandomImages(List<Icon> iconList) { 
     this.imageIconList = iconList; 
     // jpanel hold row of image-displaying JLabels 
     JPanel labelHolderPanel = new JPanel(new GridLayout(1, 0, 5, 0)); 
     for (int i = 0; i < labels.length; i++) { // create all JLabels in array 
     labels[i] = new JLabel(); 
     labels[i].setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY)); 
     labels[i].setHorizontalAlignment(SwingConstants.CENTER); // center the icon 
     labels[i].setIcon(getRandomIcon()); // initialize with a random image 
     labelHolderPanel.add(labels[i]); // add to holder JPanel 
     } 

     // panel to hold button at bottom 
     JPanel bottomPanel = new JPanel(); 
     // button uses an AbstractAction rather than an ActionListener 
     bottomPanel.add(new JButton(new ShowRandomIconAction("Show Random Image"))); 

     setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5)); 
     setLayout(new BorderLayout()); 
     add(labelHolderPanel, BorderLayout.CENTER); 
     add(bottomPanel, BorderLayout.PAGE_END); 
    } 

    private Icon getRandomIcon() { 
     int randomIndex = random.nextInt(imageIconList.size()); 
     return imageIconList.get(randomIndex); 
    } 

    private class ShowRandomIconAction extends AbstractAction { 
     public ShowRandomIconAction(String name) { 
     super(name); 
     int mnemonic = (int) name.charAt(0); 
     putValue(MNEMONIC_KEY, mnemonic); 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
     for (JLabel jLabel : labels) { 
      jLabel.setIcon(getRandomIcon()); 
     } 
     } 
    } 

    private static void createAndShowGui(List<Icon> imageIconList) { 
     ShowRandomImages mainPanel = new ShowRandomImages(imageIconList); 

     JFrame frame = new JFrame("ShowRandomImages"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     try { 
     final List<Icon> iconList = getImages(); 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       createAndShowGui(iconList); 
      } 
     }); 
     } catch (IOException e) { 
     e.printStackTrace(); 
     System.exit(-1); 
     } 
    } 

    // read in image sheet and extract sub-images from it 
    private static List<Icon> getImages() throws IOException { 
     List<Icon> iconList = new ArrayList<>(); 
     URL imageUrl = new URL(IMAGE_SHEET_PATH); 
     BufferedImage imageSheet = ImageIO.read(imageUrl); 
     for (int i = 0; i < IMAGE_COLUMNS; i++) { 
     int x = (int) ((double) i * imageSheet.getWidth()/IMAGE_COLUMNS); 
     int y = 0; 
     int w = imageSheet.getWidth()/IMAGE_COLUMNS; 
     int h = imageSheet.getHeight()/2; 

     BufferedImage subImage = imageSheet.getSubimage(x, y, w, h); 
     iconList.add(new ImageIcon(subImage)); 
     } 
     return iconList; 
    } 
} 

W przeciwnym razie, jeśli absolutnie muszą wyświetlać obrazy w sposobie malowania, polecam:

  • Tworzenie JPanel rozciągający klasy, która wyświetla tylko jedno zdjęcie, powiedzmy nazwie ImageDisplayPanel. Dasz klasę 2 z nich, jeśli chcesz wyświetlić 2 obrazy.
  • wprost pod nią List<BufferedImage>
  • Daj mu displayRandomImage() metodę
  • W tej metodzie, wybrać dowolny obraz z listy i ustawić pole BufferedImage do tego obrazu, i zadzwonić repaint().
  • Metoda paintComponent DrawImagePanel narysuje obraz przechowywany w polu, jeśli nie jest pusty.
  • W głównym GUI wywołaj tę metodę na 2 lub 3 obrazach JPanels w razie potrzeby.
+0

Dziękuję za pomoc, postaram się postępować zgodnie z Twoją radą najlepiej jak potrafię! –