2016-07-02 2 views
0

Я довольно новичок в Java и пытаюсь создать программу в Swing. Все работает, за исключением того, что фоновое изображение не отображается. Код для добавления фонового изображения кажется прекрасным (я получил помощь с этим). Моей главной задачей является мое размещение класса BackgroundPanel и экземпляр класса, который я назвал (в основном, это единственное место, на которое ссылается BackgroundPanel в основном документе). У меня также есть отдельный документ для самого класса BackgroundPanel (оба документа, вставленные ниже).Java Swing - фоновое изображение не отображается

Может кто-нибудь, пожалуйста, направить меня в правильном направлении? Я снял информацию об импорте и упаковке, потому что они занимали здесь много места. Благодаря!

Вот мой основной код:

public class InvitationCard extends JFrame { 

private JPanel contentPane; 
private JTextField txtMood; 
private JPanel panel; 
private JTextPane textPaneBody; 
private JTextPane textPaneNames; 

/** 
* Launch the application. 
*/ 
public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      try { 
       InvitationCard frame = new InvitationCard(); 
       frame.setVisible(true); 
       BackgroundPanel BP = new BackgroundPanel(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }); 
} 

/** 
* Create the frame. 
*/ 

public InvitationCard() { 
    setBackground(Color.WHITE); 
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    setBounds(100, 100, 637, 490); 
    contentPane = new JPanel(); 
    contentPane.setBackground(Color.WHITE); 
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
    setContentPane(contentPane); 
    GridBagLayout gbl_contentPane = new GridBagLayout(); 
    gbl_contentPane.columnWidths = new int[] { 0, 0, 0, 0 }; 
    gbl_contentPane.rowHeights = new int[] { 0, 0, 0, 0, 0, 0 }; 
    gbl_contentPane.columnWeights = new double[] { 0.0, 0.0, 0.0, 1.0 }; 
    gbl_contentPane.rowWeights = new double[] { 1.0, 0.0, 1.0, 0.0, 0.0, 
Double.MIN_VALUE }; 
    contentPane.setLayout(gbl_contentPane); 

    panel = new JPanel(); 
    GridBagConstraints gbc_panel = new GridBagConstraints(); 
    gbc_panel.fill = GridBagConstraints.VERTICAL; 
    gbc_panel.anchor = GridBagConstraints.WEST; 
    gbc_panel.gridwidth = 2; 
    gbc_panel.gridheight = 5; 
    gbc_panel.insets = new Insets(0, 0, 0, 5); 
    gbc_panel.gridx = 0; 
    gbc_panel.gridy = 0; 
    contentPane.add(panel, gbc_panel); 
    GridBagLayout gbl_panel = new GridBagLayout(); 
    gbl_panel.columnWidths = new int[] { 130, 0 }; 
    gbl_panel.rowHeights = new int[] { 26, 0, 0, 0 }; 
    gbl_panel.columnWeights = new double[] { 0.0, Double.MIN_VALUE }; 
    gbl_panel.rowWeights = new double[] { 0.0, 0.0, 0.0, Double.MIN_VALUE }; 
    panel.setLayout(gbl_panel); 

    Font font1 = new Font("Helvetica", Font.BOLD, 12); 
    Font font2 = new Font("Courier", Font.BOLD, 12); 
    Font font3 = new Font("nouradilla.regular", Font.BOLD, 12); 
    Font font4 = new Font("GearedSlab-Bold", Font.PLAIN, 12); 

    txtMood = new JTextField(); 
    GridBagConstraints gbc_txtMood = new GridBagConstraints(); 
    gbc_txtMood.insets = new Insets(0, 0, 5, 0); 
    gbc_txtMood.anchor = GridBagConstraints.NORTHWEST; 
    gbc_txtMood.gridx = 0; 
    gbc_txtMood.gridy = 1; 
    panel.add(txtMood, gbc_txtMood); 
    txtMood.setEditable(false); 
    txtMood.setText("Mood: "); 
    txtMood.setColumns(10); 

    JComboBox comboBox = new JComboBox(); 
    GridBagConstraints gbc_comboBox = new GridBagConstraints(); 
    gbc_comboBox.gridx = 0; 
    gbc_comboBox.gridy = 2; 
    panel.add(comboBox, gbc_comboBox); 
    comboBox.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      // get item from dropdown 
      String item = (String) comboBox.getSelectedItem(); 
      if (item == "Whimsical") { 
       textPaneNames.setFont(font1); 
       textPaneBody.setFont(font1); 
      } else if (item == "Traditional") { 
       textPaneNames.setFont(font2); 
       textPaneBody.setFont(font2); 
      } else if (item == "Modern") { 
       textPaneNames.setFont(font3); 
       textPaneBody.setFont(font3); 

      } else if (item == "Crazy") { 
       textPaneNames.setFont(font4); 
       textPaneBody.setFont(font4); 

      } 

     } 

    }); 

    comboBox.setModel(
      new DefaultComboBoxModel(new String[] { "Select", "Whimsical",  
"Traditional", "Modern", "Crazy" })); 

    textPaneNames = new JTextPane(); 
    textPaneNames.setText("FIRST1 LAST1\n&\nFIRST2 LAST2"); 
    GridBagConstraints gbc_textPaneNames = new GridBagConstraints(); 
    gbc_textPaneNames.insets = new Insets(0, 0, 5, 0); 
    gbc_textPaneNames.fill = GridBagConstraints.HORIZONTAL; 
    gbc_textPaneNames.gridx = 3; 
    gbc_textPaneNames.gridy = 0; 
    contentPane.add(textPaneNames, gbc_textPaneNames); 

    textPaneBody = new JTextPane(); 
    textPaneBody.setText(
      "REQUEST THE HONOR OF YOUR PRESENCE \nAT THEIR WEDDING 
CEREMONY\n\nFRIDAY, JANUARY SECOND\nTWO-THOUSAND AND SEVENTEEN\nSIX-THIRTY IN 
THE EVENING\n\nADDRESS GOES HERE\n903 ADDRESS LANE\nCITY, STATE\n\n\nRECEPTION 
TO FOLLOW"); 
    GridBagConstraints gbc_textPaneBody = new GridBagConstraints(); 
    gbc_textPaneBody.anchor = GridBagConstraints.NORTH; 
    gbc_textPaneBody.insets = new Insets(0, 0, 5, 0); 
    gbc_textPaneBody.fill = GridBagConstraints.HORIZONTAL; 
    gbc_textPaneBody.gridx = 3; 
    gbc_textPaneBody.gridy = 1; 
    contentPane.add(textPaneBody, gbc_textPaneBody); 

    // centers the names and body text 
    StyledDocument doc = textPaneBody.getStyledDocument(); 
    StyledDocument doc2 = textPaneNames.getStyledDocument(); 

    SimpleAttributeSet center = new SimpleAttributeSet(); 
    StyleConstants.setAlignment(center, StyleConstants.ALIGN_CENTER); 

    doc.setParagraphAttributes(0, doc.getLength(), center, false); 
    doc2.setParagraphAttributes(0, doc2.getLength(), center, false); 
} 

} 

// А вот BackgroundPanel.java:

public class BackgroundPanel extends JPanel { 

    Image image; 
    public BackgroundPanel() 
    { 
    try 
    { 
     image = javax.imageio.ImageIO.read(new 
java.net.URL(getClass().getResource("/satin.jpg"), "/satin.jpg")); 
    } 
    catch (Exception e) { /*handled in paintComponent()*/ } 
    } 

    @Override 
    protected void paintComponent(Graphics g) 
    { 
    super.paintComponent(g); 
    if (image != null) 
     g.drawImage(image, 0,0,this.getWidth(),this.getHeight(),this); 
    } 

}

+0

Вы ничего не делаете с созданной вами «BackgroundPanel» ... По крайней мере, добавьте ее в иерархию GUI! –

+0

'new java.net.URL (getClass(). GetResource ("/satin.jpg ")," /satin.jpg ")' Изображение находится по адресу '/ satin.jpg/satin.jpg'?!? Я спрашиваю, потому что 'satin.jpg' является странным именем для каталога. –

+0

@ jean-baptisteyunes Я немного новичок в Java. Я добавил некоторые сведения о BackgroundPanel к основному.Добавлял ли я еще какой-либо код в конструктор «public InvitationCard()»? (Я предполагаю, что это конструктор). – tahalam

ответ

1

Добавить это право после того, как BackgroundPanel BP = new BackgroundPanel(); в ваш главный():

frame.add(BP); 

Вам нужно добавить свой компонент в свой фрейм. В противном случае методы, такие как paint(), не будут вызываться.

+0

Спасибо, я попробую обе вещи! – tahalam

1

Ммм ... давайте посмотрим Переписывая BackgroundPanel только с помощью всего лишь нескольких модификаций, я должен это

public class BackgroundPanel extends JComponent { 
    //every code you put in this class 
} 

это должно позволить вам сделать это, если я правильно

setContentPane(new BackgroundPanel()); 

Если это не работает, скажите, пожалуйста, чтобы я мог быть лучше.

Редактировать

Переход через ваш код еще раз, я думаю, что это то, что вы должны сделать

public InvitationCard(){ 
    setContentPane(new BackgroundPanel()); 
    /* then every other code follows, 
     except the "setContentPane(contentPane)" 
     you can comment that out 
    */ 

    this.add(contentPane); 
} 

А также ваш класс BackgroundPanel все еще может оставаться подклассом JPanel, его лучше так

Больше не нужно было frame.add(BP);.

Поскольку у меня нет средств, чтобы запустить его сейчас, я до сих пор не знаю, если это решит вашу проблему ... Вы скажите мне

+0

Я добавил это к моему коду под (конструктором?) InvitationCard(), но он просто заставляет все седеть. Я попробовал это, комментируя «setContentPane (contentPane)»; и пока он был раскопан. Я также добавил «frame.add (BP)»; в основном, и ничего не случилось с этим: - /. Пожалуйста, дайте мне знать, если у вас есть еще мысли. Спасибо. – tahalam

+1

Ой также был «расширяет JComponent» намеренно? Это приносит много ошибок, если я поменяю его на JComponent от JPanel. – tahalam

+0

См., Если отредактированная часть решает вашу проблему. – Wells

0

Это может быть немного слишком поздно, но я думаю, что вы может потребоваться установить для параметра BackgroundPanel Opaque boolean значение true.

BackgroundPanel BP = new BackgroundPanel(); 
    BP.setOpaque(true); 

Возможно, вам понадобится сделать это с любой областью, в которой вы хотите иметь «фоновый» цвет или изображение.

 Смежные вопросы

  • Нет связанных вопросов^_^