Я пытаюсь создать простой графический интерфейс с переключателями, в котором есть список шрифтов, и при выборе кнопки отображается текст с именем шрифта и стилем шрифта.
Когда я пытаюсь скомпилировать, я получаю несколько ошибок о том, что "не удается найти символ... Font.PLAIN" Что-то не так с тем, как я использую шрифты?
Также в классе FontListener мне нужно передать группу кнопок, должен ли я передать группу кнопок через параметр в конструкторе?
Наконец, правильно ли я использую методы isSelected(), getSelection().getActionCommand? Класс FontFrame
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.awt.Font;
public class FontFrame extends JFrame {
Font HelveticaFont = new Font("Helvetica", Font.PLAIN, 14);
Font TimesRomanFont = new Font("TimesRoman",Font.PLAIN, 14);
Font CourierFont = new Font("Courier", Font.PLAIN,14);
public FontFrame(String title){
super(title);
}
public void init(){
Container panel = this.getContentPane();
panel.setLayout(new FlowLayout());
JRadioButton Helvetica = new JRadioButton("Helvetica", true);
JRadioButton TimesRoman = new JRadioButton("Times Roman", false);
JRadioButton Courier = new JRadioButton("Courier", false);
JTextField tf = new JTextField("Select One");
panel.add(Helvetica);
panel.add(TimesRoman);
panel.add(Courier);
panel.add(tf);
ButtonGroup group = new ButtonGroup();
group.add(Helvetica);
group.add(TimesRoman);
group.add(Courier);
Helvetica.addItemListener(new FontListener(HelveticaFont, tf));
TimesRoman.addItemListener(new FontListener(TimesRomanFont, tf));
Courier.addItemListener(new FontListener(CourierFont, tf));
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) ;
this.setSize(300,200);
this.setVisible(true);
}
}
Класс FontListener
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class FontListener implements ItemListener {
Font font;
JTextField tf;
public FontListener(Font f, JTextField tf){
this.font = f;
this.tf = tf;
}
public void itemStateChanged(ItemEvent event){
if (Helvetica.isSelected()) {
tf.setFont(font);
tf.setText(group.getActionCommand());
}
else if (TimesRoman.isSelected()) {
tf.setFont(font);
tf.setText(group.getActionCommand());
}
else if (Courier.isSelected()) {
tf.setFont(font);
tf.setText(group.getActionCommand());
}
}
}
Основной класс
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class Font{
public static void main(String[] args){
FontFrame window = new FontFrame("Fonts");
window.init();
}
}
Вы В самом деле не должны вызывать свой собственный класс Font, потому что FontListener будет использовать его вместо java.awt.Font. Это даже не шрифт, поэтому так его и не назовешь.
Возможный дубликат Порядок автоматически импортируемых пакетов и неоднозначность
Читайте также: stackoverflow.com/questions/147454/…
@Tom Тогда явный импорт import java.awt.Font; не решит проблему? Я предполагаю, что это так, и OP запускает старый код из-за других ошибок компиляции, но я бы предпочел убедиться, прежде чем голосовать...
@Aaron Когда OP явно импортирует этот класс, тогда да, это сработает, как вы можете видеть в FontFrame, где Font.PLAIN правильно распознан.
У OP также есть проблемы с такими строками, как if (Helvetica.isSelected()), но здесь эта проблема связана с плохой областью видимости переменных.
@Tom, единственные ссылки на Font.PLAIN находятся в классе FontFrame, поэтому я предполагаю, что ошибки if (Helvetica.isSelected()) помешали ему скомпилировать, и он запускает версию своего кода, в которой у него еще не было явного import java.awt.Font; в классе FontFrame, что объяснило бы ошибку cannot find symbol ... Font.PLAIN. Если я что-то пропустил? Как вы думаете, какой фрагмент кода вызывает эту ошибку?
Почему явный импорт имеет значение? Я не думал об этом, потому что думал, что awt.* будет таким же, как .font, в чем разница?
@Aaron Аарон, я не знаю, какую версию OP на самом деле пытается скомпилировать, и действительно ли сообщение об ошибке, которое он написал, выдает их код, потому что в текущей форме: это не так. Проблемы исходят от FontListener и распространяются на FontFrame, но только там, где это пытается вызвать FontListener (поскольку FontFrame передает java.awt.Font, но FontListener ожидает Font).
Эдгар, пожалуйста, прочитайте ответ в первой ссылке, он объясняет, почему это имеет значение.




Следуйте соглашениям об именах Java: имена переменных всегда пишутся в camelCase.