После того, как пользователь выберет radio button
, на radio button
слушателе вы можете проверить, сколько radio buttons
проверено, в зависимости от счетчика переключателей, который вы сможете выполнить (счетчик переключателей) * 1.50 = Итого Сумма.
Этапы.
radio buttons
не проверены. radio buttons
проверенных / незафиксированных. Псудо-код:
OnRadioSelectListner() {
checkedCount = getCheckedRadioButtonCount() //Gets the count of all checked radio butttons
totalPrice = checkCount * 1.5;
}
getCheckedRadioButtonCount() {
radioCheckedCount = 0;
if(radio1.isChecked()) then radioCheckedCount++;
if(radio2.isChecked()) then radioCheckedCount++;
if(radio3.isChecked()) then radioCheckedCount++;
.....
.....
return radioCheckedCount;
}
Я использую флажок для вашего случая. Логика остается прежней
Item.java
public class Item {
String title;
Double price;
boolean checked;
Item(String title, Double price) {
this.title = title;
this.price = price;
}
@Override
public String toString() {
return title + " - " + price;
}
}
Program.java
import javax.swing.*;
public class Program {
public static void main(String[] args) {
ScreenOne screenOne = new ScreenOne();
screenOne.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
ScreenOne.java
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import java.awt.*;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
class ScreenOne extends JFrame {
private Item items[] = {
new Item("item1", 1.5),
new Item("item2", 1.5),
new Item("item3", 1.5),
};
private JPanel jPanel = new JPanel(new GridLayout(0, 1, 4, 4));
private JLabel totalLabel;
private JCheckBox[] boxes;
ScreenOne() {
initComponents();
}
private void initComponents() {
jPanel.setBorder(new EmptyBorder(100, 100, 100, 100));
setContentPane(jPanel);
boxes = new JCheckBox[items.length];
for (int i = 0; i < items.length; i++) {
createCheckBox(i);
}
totalLabel = new JLabel("Total will appear here");
totalLabel.setBorder(new EmptyBorder(10, 10, 10, 10));
jPanel.add(totalLabel);
setTitle("Multi Checkbox Demo");
pack();
setVisible(true);
setResizable(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
private void createCheckBox(int index) {
boxes[index] = new JCheckBox(items[index].toString());
boxes[index].setBorder(new EmptyBorder(0, 0, 0, 0));
boxes[index].addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
items[index].checked = boxes[index].isSelected();
int totalItemsChecked = getCheckedCount();
totalLabel.setText("Total: " + totalItemsChecked * 1.5);
}
});
jPanel.add(boxes[index]);
}
private int getCheckedCount() {
int count = 0;
for (int i = 0; i < items.length; i++) {
if(items[i].checked) {
count++;
}
}
return count;
}
}
Вывод :
введите описание изображения здесь
введите описание изображения здесь
Надеюсь, этот ответ поможет вам.
Спасибо
Это, как гарантирует спецификация C#, будет идентично созданию строки в единственном литерале, потому что это - постоянное время компиляции. От раздела 7.18 из спецификации C# 3:
Каждый раз, когда выражение выполняет упомянутые выше требования, выражение оценено во время компиляции. Это верно, даже если выражение является подвыражением большего выражения, которое содержит непостоянные конструкции.
(См. спецификацию для точных деталей "упомянутых выше требований" :)
Спецификация языка Java указывает его около нижней части раздела 3.10.5:
Строки, вычисленные константными выражениями (§15.28), вычисляют во время компиляции и затем рассматривают, как будто они были литералами.
Действительно, в Java, компилятор повернется String
в константу.
class LongLongString
{
public LongLongString()
{
String newString = "This is a really long long long long long" +
" long long long long long long long long long long long long " +
" long long long long long long long long long string for example.";
}
public static void main(String[] args)
{
new LongLongString();
}
}
Компилируется в:
Compiled from "LongLongString.java"
class LongLongString extends java.lang.Object{
public LongLongString();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: ldc #2; //String This is a really long long long long long long long long long long long long long long long long long long long long long long long long long long string for example.
6: astore_1
7: return
public static void main(java.lang.String[]);
Code:
0: new #3; //class LongLongString
3: dup
4: invokespecial #4; //Method "<init>":()V
7: pop
8: return
}
Как видно, одна строка загружается в в строке 4, а не несколько String
экземпляры, загружаемые в.
Править: Исходный файл был скомпилирован с помощью javac
версия 1.6.0_06. Смотря на Спецификацию языка Java, Третий Выпуск, (и тот же раздел упомянул в ответе Jon Skeet), я не смог найти любую ссылку для того, должен ли компилятор связать мультилинию String
в сингл String
, таким образом, это поведение является, вероятно, определенным для реализации компилятором.
Протестируйте это на себя. В коде C# (эквивалентный Java работал бы также):
string x = "A" + "B" + "C";
string y = "ABC";
bool same = object.ReferenceEquals(x, y); // true
Вы будете видеть, что результат true
.
Как в стороне, Вы будете видеть, что строка также интернируется в строковом пуле времени выполнения:
bool interned = object.ReferenceEquals(x, string.Intern(x)); // true
Насколько я могу помнить, это не создаст несколько строк, просто та.
Никакой компромисс производительности. Оптимизация компилятора объединит это с единственной строкой (по крайней мере, в Java).
Пока все строки являются постоянными (как они находятся в Вашем примере), в Java (и я воображаю C#), компилятор преобразовывает это в единственную строку.
Вы только получаете проблемы производительности с + при конкатенации большого количества динамических строк, такой как в цикле. В этом случае используют StringBuilder или StringBuffer.
Эквивалентная.NET IL к ответу дополнительного coobird:
Для кода C#:
string s = "This is a really long long long long long" +
" long long long long long long long long long long long long " +
" long long long long long long long long long string for example.";
Console.WriteLine(s);
Компиляция отладки производит:
.method public hidebysig static void Main(string[] args) cil managed
{
.custom instance void [mscorlib]System.STAThreadAttribute::.ctor()
.maxstack 1
.locals init (
[0] string str)
L_0000: ldstr "This is a really long long long long long long long long long long long long long long long long long long long long long long long long long long string for example."
L_0005: stloc.0
L_0006: ldloc.0
L_0007: call void [mscorlib]System.Console::WriteLine(string)
L_000c: ret
}
Так, как Вы видите, это - одна строка.
Отказ от ответственности: Это верно для Java. Я принял бы его истинное для c#
Мало того, что javac создаст единственную Строку, но и JVM, будет использовать одну Строку для всей другой Строки, которые содержат тот же текст.
String a = "He" + "llo th"+ "ere";
String b = "Hell" + "o the"+ "re";
String c = "Hello" +" "+"there";
assert a == b; // these are the same String object.
assert a == c; // these are the same String object.
Примечание: они будут тем же Строковым объектом во времени выполнения, даже если они будут в различных классах в различных БАНКАХ, скомпилированных различными компиляторами.